我有如下代码,其中我使用哈希表存储创建的段的详细信息,但哈希表将覆盖所有键的最后一个值。
但是我得到的响应如下
0->47 {id=48 name= At_48,code=14512455......}
1->48 {id=48 name= At_48,code=14512455......}
我正在获取所有被最后结果覆盖的响应,如何解决此问题
答案 0 :(得分:1)
这是哈希映射的默认行为:不在乎是否覆盖以前使用的键的值。映射只是一个容器,它怎么知道您不想覆盖以前的值?
如果您需要其他东西,有两种选择:
但是请注意:然后,您将需要一个清晰的策略,如何处理在地图中已经放置了另一个值的情况。一种解决方案是使地图值成为列表。将已知键的值放入结果中:新值被添加到列表中。
答案 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)
抱歉,我仍然不能只发表评论,您遇到的问题是,用于生成密钥的哈希方法不应该返回相同的哈希码,如果两个值共享,哈希背后的整个想法就失去了意义。相同的键。更改密钥生成器方法。
致谢!