मेरे पास एक कोड है जैसे कि मैं बनाए गए सेगमेंट के विवरण को स्टोर करने के लिए हैशमैप का उपयोग कर रहा हूं लेकिन हैशमैप सभी चाबियों के लिए अंतिम मान को ओवरराइड कर रहा है।

लेकिन मुझे जो प्रतिक्रिया मिल रही है वह इस प्रकार है

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

मुझे अंतिम परिणाम से सभी प्रतिक्रियाएं ओवरराइड हो रही हैं, इस समस्या को कैसे हल करें?

0
Ikshwak 16 सितंबर 2018, 09:51

3 जवाब

सबसे बढ़िया उत्तर

आप प्रत्येक पुनरावृत्ति में समान segmentInformation का उपयोग कर रहे हैं। इस प्रकार यह returnMap में एकमात्र मान है, प्रत्येक कुंजी के लिए रखा गया है।

आपको प्रत्येक पुनरावृत्ति चरण में एक नया SegmentInformation बनाना होगा और इसे मानचित्र में रखना होगा। आपने अपनी टिप्पणी में जो समस्या बताई है वह यह है कि आप फॉर-लूप से पहले ही 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-block में भी स्थानांतरित किया है जहां इसे प्रारंभ किया गया है।

0
LuCio 16 सितंबर 2018, 11:24

यह हैश मैप का डिफ़ॉल्ट व्यवहार है: इससे कोई फर्क नहीं पड़ता कि आप पहले इस्तेमाल की गई कुंजी के मानों को ओवरराइट करते हैं। नक्शा सिर्फ एक कंटेनर है, यह कैसे पता चलेगा कि आप पिछले मानों को अधिलेखित नहीं करना चाहते हैं ?!

अगर आपको कुछ और चाहिए, तो दो विकल्प हैं:

  • आप उस वर्ग का विस्तार करते हैं, और पहले से ज्ञात कुंजी का उपयोग करने के लिए जांच करने के लिए पुट() को ओवरराइड करें
  • आपका क्लाइंट कोड जो नक्शा भरता है, कॉल करने से पहले एक कुंजी की उपस्थिति की जांच करता है ()

लेकिन ध्यान दें: फिर आपको एक स्पष्ट रणनीति की आवश्यकता होगी कि उन स्थितियों से कैसे निपटें जहां एक और मूल्य पहले से ही मानचित्र में रखा गया था। एक समाधान यह हो सकता है कि मानचित्र को एक सूची मान दिया जाए। और ज्ञात कुंजी परिणामों के लिए मान डालने में: नया मान सूची में जोड़ा जाता है।

1
GhostCat 16 सितंबर 2018, 10:03

क्षमा करें पुरुष मैं अभी भी केवल टिप्पणियां पोस्ट नहीं कर सकता, आपके पास समस्या यह है कि हैशमेथोड जो आप कुंजी उत्पन्न करने के लिए उपयोग कर रहे हैं, वही हैशकोड वापस नहीं करना चाहिए, हैशिंग के पीछे का पूरा विचार समझ में खो गया है यदि दो मान समान कुंजी साझा करते हैं . कुंजी जनरेटर विधि बदलें।

सादर!

0
Leon A.G.A. 16 सितंबर 2018, 10:06