जावा दो सूचियों की तुलना करें


92

मेरी दो सूची हैं (जावा सूची नहीं, आप दो कॉलम कह सकते हैं)

उदाहरण के लिए

**List 1**            **Lists 2**
  milan                 hafil
  dingo                 iga
  iga                   dingo
  elpha                 binga
  hafil                 mike
  meat                  dingo
  milan
  elpha
  meat
  iga                   
  neeta.peeta    

मुझे एक विधि पसंद है जो कि कई तत्व समान हैं। इस उदाहरण के लिए यह 3 होना चाहिए और यह मुझे सूची और अलग-अलग मूल्यों के समान मूल्यों को भी वापस करना चाहिए।

क्या मुझे हैशमैप का उपयोग करना चाहिए यदि हां तो अपना परिणाम प्राप्त करने के लिए क्या तरीका है?

कृपया सहायता कीजिए

पुनश्च: यह एक स्कूल असाइनमेंट नहीं है :) इसलिए यदि आप मेरा मार्गदर्शन करते हैं तो यह पर्याप्त होगा


कृपया सुझाव दें कि कोई भी डेटा संरचना सूची में जावा सूची या
हैशमैप

1
असाधारण मामलों में आपको क्या करना चाहिए, इसके बारे में सोचना सुनिश्चित करें। क्या सूचियों में दो बार समान मूल्य हो सकता है? यदि ऐसा है, अगर "डिंगो" दोनों सूची में दो बार है, तो क्या यह दो तत्वों के रूप में सामान्य या केवल एक के रूप में गिना जाता है?
जावादोकएमडी

क्या आप किसी एक सूची को संशोधित कर सकते हैं?
एंथनी फोर्लोनी

संपादन कैसे करें?? हां प्रत्येक सूची में कई बार समान मान हो सकते हैं
user238384

टैग के नीचे सवाल के ठीक बाद एक एडिट छोटा लिंक होना चाहिए ।
OscarRyz

जवाबों:


159

संपादित करें

यहाँ दो संस्करण हैं। एक का उपयोग करना ArrayListऔर दूसरा उपयोग करनाHashSet

उनकी तुलना करें और अपना खुद का संस्करण बनाएं , जब तक कि आपको वह न मिले जो आपको चाहिए।

यह कवर करने के लिए पर्याप्त होना चाहिए:

पुनश्च: यह एक स्कूल असाइनमेंट नहीं है :) इसलिए यदि आप मेरा मार्गदर्शन करते हैं तो यह पर्याप्त होगा

आपके सवाल का हिस्सा है।

मूल उत्तर के साथ जारी रखना:

आप एक java.util.Collection और / या इसके java.util.ArrayListलिए उपयोग कर सकते हैं ।

RetainAll विधि निम्नलिखित है:

इस संग्रह में केवल वे तत्व हैं जो निर्दिष्ट संग्रह में निहित हैं

यह नमूना देखें:

import java.util.Collection;
import java.util.ArrayList;
import java.util.Arrays;

public class Repeated {
    public static void main( String  [] args ) {
        Collection listOne = new ArrayList(Arrays.asList("milan","dingo", "elpha", "hafil", "meat", "iga", "neeta.peeta"));
        Collection listTwo = new ArrayList(Arrays.asList("hafil", "iga", "binga", "mike", "dingo"));

        listOne.retainAll( listTwo );
        System.out.println( listOne );
    }
}

संपादित करें

दूसरे भाग (समान मान) के लिए आप निष्कासन विधि का उपयोग कर सकते हैं :

इस संग्रह के उन सभी तत्वों को हटा देता है जो निर्दिष्ट संग्रह में समाहित हैं।

यह दूसरा संस्करण आपको समान मूल्यों और बार-बार हैंडल करने (उन्हें छोड़ने से) को देता है।

इस बार Collectionएक के Setबजाय हो सकता है List(अंतर यह है, सेट दोहराया मूल्यों की अनुमति नहीं देता है)

import java.util.Collection;
import java.util.HashSet;
import java.util.Arrays;

class Repeated {
      public static void main( String  [] args ) {

          Collection<String> listOne = Arrays.asList("milan","iga",
                                                    "dingo","iga",
                                                    "elpha","iga",
                                                    "hafil","iga",
                                                    "meat","iga", 
                                                    "neeta.peeta","iga");

          Collection<String> listTwo = Arrays.asList("hafil",
                                                     "iga",
                                                     "binga", 
                                                     "mike", 
                                                     "dingo","dingo","dingo");

          Collection<String> similar = new HashSet<String>( listOne );
          Collection<String> different = new HashSet<String>();
          different.addAll( listOne );
          different.addAll( listTwo );

          similar.retainAll( listTwo );
          different.removeAll( similar );

          System.out.printf("One:%s%nTwo:%s%nSimilar:%s%nDifferent:%s%n", listOne, listTwo, similar, different);
      }
}

आउटपुट:

$ java Repeated
One:[milan, iga, dingo, iga, elpha, iga, hafil, iga, meat, iga, neeta.peeta, iga]

Two:[hafil, iga, binga, mike, dingo, dingo, dingo]

Similar:[dingo, iga, hafil]

Different:[mike, binga, milan, meat, elpha, neeta.peeta]

अगर यह आपकी जरूरत के अनुसार नहीं करता है, तो यह आपको एक अच्छी शुरुआत देता है ताकि आप यहां से संभाल सकें।

पाठक के लिए प्रश्न: आप सभी दोहराया मूल्यों को कैसे शामिल करेंगे?


@ ऑस्कर, मेरा सटीक विचार है, लेकिन मुझे यकीन नहीं था कि अगर हम सामग्री को संशोधित कर सकते थे listOne, लेकिन +1 वैसे भी!
एंथोनी फोर्लोनी

@poygenel स्नेहक क्या आप कच्चे प्रकार जेनेरिक से मतलब नहीं है? क्यों नहीं?
ऑस्कररेज़

ऑस्कर, क्या आपने मेरा अद्यतन प्रश्न देखा? क्या यह दोहराया मूल्यों का समर्थन करता है?
user238384

@Oscar: java.sun.com/docs/books/jls/third_edition/html/… "जावा प्रोग्रामिंग लैंग्वेज में उदारता की शुरुआत के बाद लिखे गए कोड में कच्चे प्रकार का उपयोग दृढ़ता से हतोत्साहित किया जाता है। यह संभव है कि भविष्य के संस्करणों में।" जावा प्रोग्रामिंग भाषा कच्चे प्रकारों के उपयोग को समाप्त कर देगी। "
पॉलीजेन लुब्रिकेंट

2
डुप्लिकेट और कच्चे प्रकार को संभालने के लिए @polygenel स्नेहक उत्तर अपडेट किया गया। BTW, .. जावा का .. सीवन संस्करण कभी नहीं होने वाला है। ;)
ऑस्करराइज़

37

आप कोशिश कर सकते हैं intersection()और subtract()तरीकों से CollectionUtils

intersection()विधि आपको एक संग्रह देती है जिसमें सामान्य तत्व होते हैं और यह subtract()विधि आपको सभी असामान्य चीजें देती है।

उन्हें समान तत्वों का भी ध्यान रखना चाहिए


6
ध्यान दें कि इस समाधान के लिए Apache Ccommons
Sir Codesalot की

9

क्या ये वास्तव में सूचियाँ हैं (डुप्लिकेट के साथ) का आदेश दिया गया है, या क्या वे सेट किए गए हैं (अनियंत्रित, कोई डुप्लिकेट नहीं)?

क्योंकि अगर यह बाद का है, तो आप java.util.HashSet<E>सुविधाजनक का उपयोग करके अपेक्षित रैखिक समय में इसका उपयोग, कह सकते हैं और कर सकते हैं retainAll

    List<String> list1 = Arrays.asList(
        "milan", "milan", "iga", "dingo", "milan"
    );
    List<String> list2 = Arrays.asList(
        "hafil", "milan", "dingo", "meat"
    );

    // intersection as set
    Set<String> intersect = new HashSet<String>(list1);
    intersect.retainAll(list2);
    System.out.println(intersect.size()); // prints "2"
    System.out.println(intersect); // prints "[milan, dingo]"

    // intersection/union as list
    List<String> intersectList = new ArrayList<String>();
    intersectList.addAll(list1);
    intersectList.addAll(list2);
    intersectList.retainAll(intersect);
    System.out.println(intersectList);
    // prints "[milan, milan, dingo, milan, milan, dingo]"

    // original lists are structurally unmodified
    System.out.println(list1); // prints "[milan, milan, iga, dingo, milan]"
    System.out.println(list2); // prints "[hafil, milan, dingo, meat]"

अच्छी तरह से मैं वास्तव में नहीं जानता कि यह किस डेटा संरचना का होना चाहिए। इसकी नकल है। अब आप अद्यतन प्रश्न देख सकते हैं
user238384

क्या यह डेटा सेट से दोहराया मूल्यों को हटा देगा? coz मैं किसी भी मूल्य को
खोना

@agazerboy: मैंने दोनों प्रश्नों को हल करने की कोशिश की है। अधिक स्पष्टीकरण मांगने के लिए स्वतंत्र महसूस करें।
पॉलीजेन लुब्रिकेंट

धन्यवाद पाली। मैंने आपके कार्यक्रम को उदाहरण के लिए पहली सूची में डुप्लिकेट के साथ दो बार "iga" जोड़ा, लेकिन फिर भी इसने मुझे उत्तर के रूप में 3 दिया। जबकि यह अब 4 होना चाहिए। coz सूची 1 में 4 समान मूल्य हैं। अगर मैंने एक बार एक प्रविष्टि जोड़ी तो यह काम करना चाहिए। आपका क्या कहना है? किसी भी डेटा संरचना?
user238384

6

जावा 8 हटाने का उपयोग करना

public int getSimilarItems(){
    List<String> one = Arrays.asList("milan", "dingo", "elpha", "hafil", "meat", "iga", "neeta.peeta");
    List<String> two = new ArrayList<>(Arrays.asList("hafil", "iga", "binga", "mike", "dingo")); //Cannot remove directly from array backed collection
    int initial = two.size();

    two.removeIf(one::contains);
    return initial - two.size();
}

यह अच्छा लग रहा है, लेकिन अगर मैं सूचियों को अनधिकृत रखना चाहता हूं तो मुझे सूची में से एक को क्लोन करना होगा और कुछ मामलों में वांछित नहीं होगा।
सेबेस्टियन

6

यदि आप दो संग्रह की समानता का परीक्षण करने के लिए एक आसान तरीका ढूंढ रहे हैं, तो आप उपयोग कर सकते हैं org.apache.commons.collections.CollectionUtils.isEqualCollection, जो क्रम की परवाह किए बिना दो संग्रह की तुलना करता है।


4

सभी दृष्टिकोणों में से, मुझे लगता org.apache.commons.collections.CollectionUtils#isEqualCollectionहै कि सबसे अच्छा तरीका है। ये रहे कारण -

  • मुझे किसी अतिरिक्त सूची की घोषणा करने की आवश्यकता नहीं है
  • मैं इनपुट सूचियों को परिवर्तित नहीं कर रहा हूं
  • यह बहुत कुशल है। यह O (N) जटिलता में समानता की जांच करता है।

यदि यह apache.commons.collectionsनिर्भरता के रूप में संभव नहीं है , तो मैं दक्षता के कारण सूची की समानता की जांच करने के लिए एल्गोरिथ्म को लागू करने की सिफारिश करूंगा।



1

मान लिया hash1औरhash2

List< String > sames = whatever
List< String > diffs = whatever

int count = 0;
for( String key : hash1.keySet() )
{
   if( hash2.containsKey( key ) ) 
   {
      sames.add( key );
   }
   else
   {
      diffs.add( key );
   }
}

//sames.size() contains the number of similar elements.

वह समान कुंजियों की सूची चाहता है, न कि कितनी कुंजियाँ समान हैं। मुझे लगता है।
रोजडी कासिम

आपकी मदद के लिए धन्यवाद स्टीफन। हाँ रोजी सही है और आप भी। मुझे समान मूल्यों और समान मूल्यों की कुल संख्या की आवश्यकता है।
user238384

1

मुझे सूची में सूची तुलना का एक बहुत ही मूल उदाहरण मिला। तुलना करें यह उदाहरण पहले आकार की पुष्टि करता है और फिर एक सूची के विशेष तत्व की उपलब्धता की दूसरे में जांच करता है।


-1
public static boolean compareList(List ls1, List ls2){
    return ls1.containsAll(ls2) && ls1.size() == ls2.size() ? true :false;
     }

public static void main(String[] args) {

    ArrayList<String> one = new ArrayList<String>();
    one.add("one");
    one.add("two");
    one.add("six");

    ArrayList<String> two = new ArrayList<String>();
    two.add("one");
    two.add("six");
    two.add("two");

    System.out.println("Output1 :: " + compareList(one, two));

    two.add("ten");

    System.out.println("Output2 :: " + compareList(one, two));
  }

1
यह समाधान गलत परिणाम देता है जब दो में "एक" की 3 प्रतियां होती हैं। यह गलत तरीके से सही परिणाम देगा।
जोसेफ फिजराल्ड़

इस भाग के लिए धन्यवाद: && ls1.size () == ls2.size ()
Nouar

1
कोई कारण जो आपको लगता ? true :falseहै कि आपके स्निपेट में आवश्यक है?
करज़िस्तोफ Tomaszewski
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.