मेरे पास कई ArrayList
रिकॉर्ड हैं और एक कॉलम में सीओ 2 सीएच 4 एसओ 2 इत्यादि के रूप में गैस के नाम हैं। अब मैं केवल पुनरावृत्ति के बिना विभिन्न गैस नामों (अद्वितीय) को फिर से प्राप्त करना चाहता हूं ArrayList
। यह कैसे किया जा सकता है?
मेरे पास कई ArrayList
रिकॉर्ड हैं और एक कॉलम में सीओ 2 सीएच 4 एसओ 2 इत्यादि के रूप में गैस के नाम हैं। अब मैं केवल पुनरावृत्ति के बिना विभिन्न गैस नामों (अद्वितीय) को फिर से प्राप्त करना चाहता हूं ArrayList
। यह कैसे किया जा सकता है?
जवाबों:
आप एक का उपयोग करना चाहिए 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
निर्माता तत्वों के बराबर () विधियों को लागू करके डुप्लिकेट की पहचान करता है ।
java: no suitable constructor found for HashSet
:। किसी भी विचार क्यों ऐसा होता है?
LinkedHashSet
stackoverflow.com/a/8712770/32453
विधि विशिष्ट एक मध्यवर्ती ऑपरेशन है जो स्ट्रीम को फ़िल्टर करता है और अगले ऑपरेशन को पारित करने के लिए केवल अलग-अलग मान (ऑब्जेक्ट का उपयोग करके वस्तु :: बराबर विधि) की अनुमति देता है।
मैंने आपके मामले के लिए नीचे एक उदाहरण लिखा है,
// 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
मुझे आशा है कि मैं आपके प्रश्न को सही ढंग से समझता हूं: यह मानते हुए कि मूल्य प्रकार के हैं String
, संभवतः सबसे कुशल तरीका एक को बदलने HashSet
और उस पर निर्भर करने के लिए है:
ArrayList<String> values = ... //Your values
HashSet<String> uniqueValues = new HashSet<>(values);
for (String value : uniqueValues) {
... //Do something
}
यहाँ कस्टम तुलना या सामान की तरह सहारा के बिना सीधा तरीका है:
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
जब छंटाई की आवश्यकता होती है।
आप इसका उपयोग सूची को विशिष्ट बनाने के लिए कर सकते हैं
ArrayList<String> listWithDuplicateValues = new ArrayList<>();
list.add("first");
list.add("first");
list.add("second");
ArrayList uniqueList = (ArrayList) listWithDuplicateValues.stream().distinct().collect(Collectors.toList());
जब मैं एक ही क्वेरी कर रहा था, मेरे पास मेरे मामले के समाधान को समायोजित करने में कठिन समय था, हालांकि पिछले सभी उत्तरों में अच्छी अंतर्दृष्टि है।
यहाँ एक समाधान है जब किसी को अद्वितीय वस्तुओं की सूची हासिल करनी होती है, न कि तार। मान लीजिए, किसी के पास रिकॉर्ड ऑब्जेक्ट की सूची है। 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);
}
यह केवल हैशसेट, अलग-अलग रिकॉर्ड्स में अलग-अलग रिकॉर्ड जोड़ेगा।
उम्मीद है की यह मदद करेगा।
यदि आपके पास किसी प्रकार की वस्तु (बीन) की एक सरणी है, तो आप ऐसा कर सकते हैं:
List<aBean> gasList = createDuplicateGasBeans();
Set<aBean> uniqueGas = new HashSet<aBean>(gasList);
जैसे ऊपर मथियास श्वार्ज़ ने कहा, लेकिन आपको अपना बाइन तरीकों के साथ प्रदान करना होगा hashCode()
और equals(Object obj)
यह आसानी से ग्रहण किया जा सकता है समर्पित मेनू ' Generate hashCode() and equals()
' (जबकि बीन क्लास में)। सेट वस्तुओं के भेदभाव के लिए ओवरराइड विधियों का मूल्यांकन करेगा।