जावा में arraylist से अद्वितीय मान प्राप्त करें


83

मेरे पास कई ArrayListरिकॉर्ड हैं और एक कॉलम में सीओ 2 सीएच 4 एसओ 2 इत्यादि के रूप में गैस के नाम हैं। अब मैं केवल पुनरावृत्ति के बिना विभिन्न गैस नामों (अद्वितीय) को फिर से प्राप्त करना चाहता हूं ArrayList। यह कैसे किया जा सकता है?


4
मैं टैग को अपडेट करूंगा। यह एक जावा सवाल है और मेरा मानना ​​है कि यह jsf और प्राइमफेस से असंबंधित है ...
मथियास श्वार्ज़

जवाबों:


136

आप एक का उपयोग करना चाहिए Set। A एक Setऐसा संग्रह है जिसमें कोई डुप्लिकेट नहीं है।

यदि आपके पास Listडुप्लिकेट है, तो आप इस तरह की अनूठी प्रविष्टियां प्राप्त कर सकते हैं:

List<String> gasList = // create list with duplicates...
Set<String> uniqueGas = new HashSet<String>(gasList);
System.out.println("Unique gas count: " + uniqueGas.size());

नोट : यह HashSetनिर्माता तत्वों के बराबर () विधियों को लागू करके डुप्लिकेट की पहचान करता है ।


तात्पर्य यह है कि यदि उनके नाम समान हैं तो 2 रिकॉर्ड को समान (हशसेट के अर्थ में) माना जाता है।
njzk2

@ njzk2 - मुझे लगा कि यह बहुत स्पष्ट होगा, लेकिन मुझे लगता है कि मैं इसे स्पष्ट रूप से इंगित करने के लिए संपादित कर सकता हूं ...
जहरॉय

उपरोक्त कोड को लागू करने का प्रयास करते समय मुझे एक त्रुटि मिलती है java: no suitable constructor found for HashSet:। किसी भी विचार क्यों ऐसा होता है?
lordlabakdas

यदि आप सूची से एक मूल क्रम बनाए रखना चाहते हैं तो LinkedHashSet stackoverflow.com/a/8712770/32453
rogerdpack

68

आप जावा 8 स्ट्रीम एपीआई का उपयोग कर सकते हैं ।

विधि विशिष्ट एक मध्यवर्ती ऑपरेशन है जो स्ट्रीम को फ़िल्टर करता है और अगले ऑपरेशन को पारित करने के लिए केवल अलग-अलग मान (ऑब्जेक्ट का उपयोग करके वस्तु :: बराबर विधि) की अनुमति देता है।
मैंने आपके मामले के लिए नीचे एक उदाहरण लिखा है,

// Create the list with duplicates.
List<String> listAll = Arrays.asList("CO2", "CH4", "SO2", "CO2", "CH4", "SO2", "CO2", "CH4", "SO2");

// Create a list with the distinct elements using stream.
List<String> listDistinct = listAll.stream().distinct().collect(Collectors.toList());

// Display them to terminal using stream::collect with a build in Collector.
String collectAll = listAll.stream().collect(Collectors.joining(", "));
System.out.println(collectAll); //=> CO2, CH4, SO2, CO2, CH4 etc..
String collectDistinct = listDistinct.stream().collect(Collectors.joining(", "));
System.out.println(collectDistinct); //=> CO2, CH4, SO2

12

मुझे आशा है कि मैं आपके प्रश्न को सही ढंग से समझता हूं: यह मानते हुए कि मूल्य प्रकार के हैं String, संभवतः सबसे कुशल तरीका एक को बदलने HashSetऔर उस पर निर्भर करने के लिए है:

ArrayList<String> values = ... //Your values
HashSet<String> uniqueValues = new HashSet<>(values);
for (String value : uniqueValues) {
   ... //Do something
}

6
ArrayList values = ... // your values
Set uniqueValues = new HashSet(values); //now unique

मुझे अब सूची से अद्वितीय तत्व मिल रहे हैं, लेकिन इसे स्वयं ही सॉर्ट किया जा रहा है। लेकिन मुझे डेटा को क्रमबद्ध क्रम में नहीं होना चाहिए। यह कैसे किया जा सकता है?
5

6

यहाँ कस्टम तुलना या सामान की तरह सहारा के बिना सीधा तरीका है:

Set<String> gasNames = new HashSet<String>();
List<YourRecord> records = ...;

for(YourRecord record : records) {
  gasNames.add(record.getGasName());
}

// now gasNames is a set of unique gas names, which you could operate on:
List<String> sortedGasses = new ArrayList<String>(gasNames);
Collections.sort(sortedGasses);

नोट: TreeSetइसके बजाय का उपयोग करना HashSetसीधे सॉर्ट किए गए सरणी सूची देगा और ऊपर Collections.sortछोड़ दिया जा सकता है, लेकिन TreeSetअन्यथा कम प्रभावकारक है, इसलिए यह अक्सर बेहतर होता है, और शायद ही कभी बदतर होता है, HashSetजब छंटाई की आवश्यकता होती है।


3

आप इसका उपयोग सूची को विशिष्ट बनाने के लिए कर सकते हैं

ArrayList<String> listWithDuplicateValues = new ArrayList<>();
list.add("first");
list.add("first");
list.add("second");

ArrayList uniqueList = (ArrayList) listWithDuplicateValues.stream().distinct().collect(Collectors.toList());

2

जब मैं एक ही क्वेरी कर रहा था, मेरे पास मेरे मामले के समाधान को समायोजित करने में कठिन समय था, हालांकि पिछले सभी उत्तरों में अच्छी अंतर्दृष्टि है।

यहाँ एक समाधान है जब किसी को अद्वितीय वस्तुओं की सूची हासिल करनी होती है, न कि तार। मान लीजिए, किसी के पास रिकॉर्ड ऑब्जेक्ट की सूची है। Recordवर्ग में केवल प्रकार के गुण होते हैं, प्रकार की Stringकोई संपत्ति नहीं int। यहाँ कार्यान्वयन hashCode()मुश्किल हो जाता है क्योंकि hashCode()वापस करने की आवश्यकता होती है int

निम्नलिखित एक नमूना Recordवर्ग है।

public class Record{

    String employeeName;
    String employeeGroup;

    Record(String name, String group){  
        employeeName= name;
        employeeGroup = group;    
    }
    public String getEmployeeName(){
        return employeeName;
    }
    public String getEmployeeGroup(){
        return employeeGroup;
    }

  @Override
    public boolean equals(Object o){
         if(o instanceof Record){
            if (((Record) o).employeeGroup.equals(employeeGroup) &&
                  ((Record) o).employeeName.equals(employeeName)){
                return true;
            }
         }
         return false;
    }

    @Override
    public int hashCode() { //this should return a unique code
        int hash = 3; //this could be anything, but I would chose a prime(e.g. 5, 7, 11 )
        //again, the multiplier could be anything like 59,79,89, any prime
        hash = 89 * hash + Objects.hashCode(this.employeeGroup); 
        return hash;
    }

जैसा कि पहले दूसरों ने सुझाव दिया था, वर्ग को equals()और दोनों को ओवरराइड करने की आवश्यकता हैhashCode() को उपयोग करने में सक्षम होने के विधिHashSet

अब, मान लीजिए, रिकॉर्ड्स की सूची है allRecord( List<Record> allRecord)।

Set<Record> distinctRecords = new HashSet<>();

for(Record rc: allRecord){
    distinctRecords.add(rc);
}

यह केवल हैशसेट, अलग-अलग रिकॉर्ड्स में अलग-अलग रिकॉर्ड जोड़ेगा।

उम्मीद है की यह मदद करेगा।


2
    public static List getUniqueValues(List input) {
      return new ArrayList<>(new LinkedHashSet<>(incoming));
    }

पहले अपनी बराबरी का तरीका लागू करना न भूलें


1

यदि आपके पास किसी प्रकार की वस्तु (बीन) की एक सरणी है, तो आप ऐसा कर सकते हैं:

List<aBean> gasList = createDuplicateGasBeans();
Set<aBean> uniqueGas = new HashSet<aBean>(gasList);

जैसे ऊपर मथियास श्वार्ज़ ने कहा, लेकिन आपको अपना बाइन तरीकों के साथ प्रदान करना होगा hashCode()और equals(Object obj)यह आसानी से ग्रहण किया जा सकता है समर्पित मेनू ' Generate hashCode() and equals()' (जबकि बीन क्लास में)। सेट वस्तुओं के भेदभाव के लिए ओवरराइड विधियों का मूल्यांकन करेगा।

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