2015-04-23 8 views
9

मैं प्रोग्रामिंग के लिए नया हूं और मैं एक ऐसी विधि लिखने की कोशिश कर रहा हूं जो सूची में सबसे अच्छा विकल्प चुनेगा। यहाँ मैं क्या मिल गया है है:किसी प्राथमिक प्राथमिकता वाले तत्वों के बीच चयन कैसे करें?

item_no  item_type  origin    
10    2    US 
10    2    FR 
10    4    UK 
11    6    FR 

मैं एक सूची में इन डाल:

[[10, 2, US], [10, 2, FR], [10, 4, UK], [11, 6, FR]] 

मैं अपने विधि में इस सूची का समय लगेगा और मैं भी कुछ सुविधाओं के साथ एक विशिष्ट आइटम की है। आइए मेरा विशिष्ट आइटम इस प्रकार चुनें;

item_no item_type origin 
10   4   GE 

अब, मुझे क्या करना चाहते हैं, तो सूची में आइटम्स में से एक अपने मद की तुलना में उच्च प्राथमिकता है, मैं उच्च प्राथमिकता आइटम की सुविधाओं के साथ अपने मद की सुविधाओं अपडेट कर देगा। प्राथमिकता तर्क क्रमश: item_code, item_type और origin पर निर्भर करता है। मैं नीचे की तरह नक्शे का उपयोग कर रहा प्राथमिकता क्रम पाने के लिए:

HashMap<String, Integer> itemCodeOrder = x.getItemCodeOrder();  
HashMap<String, Integer> itemTypeOrder = y.getItemTypeOrder(); 
HashMap<String, Integer> originOrder = z.getOriginOrder() 

एक ठेठ प्राथमिकता क्रम इस तरह है:

  • itemCodeOrder: 12, 10, 11
  • itemTypeOrder: 6, 2, 4
  • originOrder: अमेरिका, ब्रिटेन, फ़्रांस, जीई

पहली जगह में मैं इस सूची में और compar की तुलना में अधिक प्राथमिकता आइटम का चयन करना चाहते ई आइटम को मेरे आइटम के साथ अद्यतन करने के लिए या नहीं। उदाहरण के लिए, item_no 10 से ऊपर की सूची में 11 से अधिक प्राथमिकता है, इसलिए मैं उन वस्तुओं में से एक को चुनूंगा जिनमें item_no 10 है। फिर, मैं item_type पर देखूंगा: मेरे पास 2 और 4 है, अब मैं 2 वाले आइटम में से एक चुनूंगा। तो origin देखने के बाद, मैं अंत में [10, 2, US] मिल जाएगा मैं अपने आइटम के साथ तुलना की जाती है और अद्यतन की तरह है:

item_no item_type origin 
    10   2  US 

मैं एक सामान्य कोड लिखना चाहते हैं लेकिन मैं एक उचित तरीके से नहीं मिल सका मेरे HashMap तर्क के साथ सूची में पूर्व आइटम प्राप्त करने के लिए। मैं इसके साथ कैसे संभाल सकता हूं?

+1

आप आइटम तुलनित्र लिख सकते हैं और प्राथमिकता से सूची को सॉर्ट कर सकते हैं। फिर विशिष्ट आइटम के लिए बस यह पता लगाएं कि सूची में बड़ी प्राथमिकता है या नहीं। – StanislavL

+0

जैसा कि स्टैनिस्लाव ने टिप्पणी की, आपको जो चाहिए वह तुलनित्र के लिए एक अच्छी नौकरी है। आप इसे अपने मानचित्रों का उपयोग करके प्राथमिकता शब्दकोश वाले कन्स्ट्रक्टर तर्क के रूप में बना सकते हैं। –

उत्तर

6

सबसे पहले, एक तुलनित्र है, जो origin द्वारा type द्वारा code से पहले की तुलना होगा, तो, और अंत में बनाने: तो फिर आइटम की तरह अपनी सूची

Comparator<Item> comparator = new Comparator<Item>() { 

    Map<String, Integer> codes = x.getItemCodeOrder();  
    Map<String, Integer> types = y.getItemTypeOrder(); 
    Map<String, Integer> origins = z.getOriginOrder(); 

    @Override 
    public int compare(Item a, Item b) { 

     int byCode = Objects.requireNonNull(codes.get(a.code)) 
         .compareTo(Objects.requireNonNull(codes.get(b.code))); 

     if (byCode == 0) { 
      int byType = Objects.requireNonNull(types.get(a.type)) 
          .compareTo(Objects.requireNonNull(types.get(b.type))); 

      if (byType == 0) { 
       return Objects.requireNonNull(origins.get(a.origin)) 
         .compareTo(Objects.requireNonNull(origins.get(b.origin))); 

      } else 
       return byType; 

     } else 
      return byCode; 
    } 
}; 

,:

Collections.sort(items, comparator); 

नवीनतम सूची में आइटम अब सर्वोच्च प्राथमिकता है।


पीएस यदि आप सॉर्ट करने से पहले सभी सूची आइटमों पर शून्य-जांच करते हैं, तो Objects.requiresNonNull() रैपिंग को आसानी से छोड़ा जा सकता है।

+1

आपको बहुत बहुत धन्यवाद। यह वही है जो मैं ढूंढ रहा हूं :) – theYoungPadawan

संबंधित मुद्दे