如何防止Hashmap覆盖具有不同值的相同键

时间:2018-09-16 06:51:31

标签: java hashmap

我有如下代码,其中我使用哈希表存储创建的段的详细信息,但哈希表将覆盖所有键的最后一个值。

但是我得到的响应如下

0->47 {id=48 name= At_48,code=14512455......}
1->48 {id=48 name= At_48,code=14512455......}

我正在获取所有被最后结果覆盖的响应,如何解决此问题

3 个答案:

答案 0 :(得分:1)

这是哈希映射的默认行为:不在乎是否覆盖以前使用的键的值。映射只是一个容器,它怎么知道您不想覆盖以前的值?

如果您需要其他东西,有两种选择:

  • 您扩展了该类,并@Override put()来检查是否使用已知密钥
  • 您填充地图的客户端代码会在调用put()之前检查密钥的存在

但是请注意:然后,您将需要一个清晰的策略,如何处理在地图中已经放置了另一个值的情况。一种解决方案是使地图值成为列表。将已知键的值放入结果中:新值被添加到列表中。

答案 1 :(得分:0)

您在每次迭代中都使用相同 segmentInformation。因此,它是returnMap中唯一的值,用于每个键。

您需要在每个迭代步骤中创建一个新的SegmentInformation并将其放入地图中。您在评论中指出的问题是,在for循环之前,您已经在使用segmentInformation。只有audienceDataMap.isEmpty()才是这种情况。我建议您将此代码与循环代码分开。

  private Single<Map<String, CreationResponse>> createSegment(List<Integer> audienceIds) {
    try {
      createToken();
    }
    catch (ValidationServiceException e) {
      SegmentInformation segmentInformation = new SegmentInformation();
      segmentInformation.setError(SEGMENT_CREATION_EXCEPTION.getMessage());
      Map<String, CreationResponse> returnMap = new HashMap<>();
      returnMap.put(segmentInformation.getAudienceId().toString(), segmentInformation);
      logger.error(TOKEN_CREATION_EXCEPTION.getMessage());
    }
    catch (IOException e) {
      SegmentInformation segmentInformation = new SegmentInformation();
      segmentInformation.setError(SEGMENT_CREATION_EXCEPTION.getMessage() + SEGMENT_CODE_EXIST.getMessage());
      Map<String, CreationResponse> returnMap = new HashMap<>();
      returnMap.put(segmentInformation.getAudienceId().toString(), segmentInformation);
      logger.error(SEGMENT_CREATION_EXCEPTION.getMessage());
    }

    List<ListBasedAudienceFetcher.AcAudience> audienceDataMap = audienceIds != null ?
      impl.processAudienceByIds(audienceIds) :
      impl.processAudience();

    if (audienceDataMap.isEmpty()) {
      SegmentInformation segmentInformation = new SegmentInformation();
      segmentInformation.setError(PROGRAMS_NOT_CREATED.getMessage());
      Map<String, CreationResponse> returnMap = new HashMap<>();
      returnMap.put(CREATE_PROGRAM.getMessage(), segmentInformation);
      return Single.just(returnMap);
    }

    Map<String, CreationResponse> returnMap = new HashMap<>();
    for (ListBasedAudienceFetcher.AcAudience audienceData : audienceDataMap) {
      SegmentInformation segmentInformation = new SegmentInformation();
      segmentInformation.setMemberId(memberId);
      segmentInformation.setAudienceId(audienceData.getId());
      String audienceName = getSegmentName(audienceData);
      segmentInformation.setAudienceName(audienceName);
      try {
        String createSegmentResponse = Util.post(new PayLoad()
          .setUrl(AppNexusConstants.APPNEXUS_SEGMENT_URL + "/" + memberId)
          .setRequestType(Request.POST)
          .setHeader(getAppnexusAuthHeader())
          .setPayload(createSegmentPayload(audienceData, memberId)));
        SegmentResponse segmentResponse = Util.mapper.readValue(createSegmentResponse, SegmentResponse.class);
        if (segmentResponse != null
          && segmentResponse.getResponse().getStatus() != null
          && segmentResponse.getResponse().getStatus().equals("OK")) {
          BillingData billingData = billingSegment(audienceData, segmentResponse.getResponse().getSegmentData());
          segmentResponse.getResponse().getSegmentData().setBillingData(billingData);
        } else {
          segmentInformation.setError(SEGMENT_CREATION_EXCEPTION.getMessage() + audienceData.getId());
        }
        segmentInformation.setSegmentCreationResponses(segmentResponse);
        returnMap.put(audienceData.getId().toString(), segmentInformation);
      }
      catch (IOException e) {
        segmentInformation.setError(SEGMENT_CREATION_EXCEPTION.getMessage() + SEGMENT_CODE_EXIST.getMessage());
        returnMap.put(segmentInformation.getAudienceId().toString(), segmentInformation);
        logger.error(SEGMENT_CREATION_EXCEPTION.getMessage());
      }
    }

    return Single.just(returnMap);
  }

请注意,我还将billingData的声明移到了初始化它的if块中。

答案 2 :(得分:0)

抱歉,我仍然不能只发表评论,您遇到的问题是,用于生成密钥的哈希方法不应该返回相同的哈希码,如果两个值共享,哈希背后的整个想法就失去了意义。相同的键。更改密钥生成器方法。

致谢!