2015-05-05 20 views
28

जावा 8 में, यह जांचने का सबसे अच्छा तरीका क्या है कि किसी सूची में कोई डुप्लिकेट है या नहीं?जावा 8 स्ट्रीम में कोई डुप्लिकेट मौजूद है या नहीं?

मेरा विचार था की तरह कुछ:

list.size() != list.stream().distinct().count() 

यह सबसे अच्छा तरीका है?

+2

अगर आप जानने में दिलचस्पी नहीं कर रहे हैं उन लोगों के डुप्लिकेट क्या कर रहे हैं, तो यह सबसे अच्छा तरीका है !! –

उत्तर

26

आपके कोड को सभी तत्वों पर पुन: प्रयास करने की आवश्यकता होगी। यदि आप यह सुनिश्चित करना चाहते हैं कि

public static <T> boolean containsUnique(List<T> list){ 
    Set<T> set = new HashSet<>(); 

    for (T t: list){ 
     if (!set.add(t)) 
      return false; 
    } 

    return true; 
} 

अधिक डुप्लीकेट आसान विधि नहीं है।

इस विधि भी

public static <T> boolean containsUnique(List<T> list){ 
    Set<T> set = new HashSet<>(); 
    return list.stream().allMatch(t -> set.add(t)); 
} 

या @Holger के रूप में टिप्पणी में आपका उल्लेख

public static <T> boolean containsUnique(List<T> list){ 
    return list.stream().allMatch(new HashSet<>()::add); 
} 
+18

यह एक-लाइनर भी हो सकता है: 'वापसी सूची। स्ट्रीम()। AllMatch (नया हैशसेट <>() :: जोड़ें); ' – Holger

+2

@ होल्गर वाह, मैं इसके बारे में कभी नहीं। हर दिन मैं कुछ नया सीखता हूं :) धन्यवाद! – Pshemo

+6

साइड इफेक्ट्स के साथ एक भविष्यवाणी का उपयोग करने के लिए थोड़ा खतरनाक लगता है। –

1

एक StreamTool के रूप में इस वर्ग के प्रारंभ के रूप में (यह मानते हुए गैर समानांतर नदियों और धागे की सुरक्षित वातावरण) फिर से लिखा जा सकता है, लेकिन मुझे लगता है कि कम या समान के साथ एक बेहतर तरीका होना चाहिए:

public class StreamTool { 

    /** 
    * Whether stream records are unique in that stream. 
    * @param <T> Type of records 
    * @param records 
    * @return true if there are no duplicates, false otherwise 
    */ 
    public static <T> boolean isUnique(Stream<T> records) { 
     return records.allMatch(new HashSet<>()::add); 
    } 
} 
7

मैंने निम्नलिखित का उपयोग किया:
1. return list.size() == new HashSet<>(list).size();
2. return list.size() == list.stream().distinct().count();
और
3. return list.stream().sequential().allMatch(new HashSet<>()::add);
प्रदर्शन के संदर्भ में:

मुझे यकीन है कि कैसे यह करने के लिए तुलना नहीं कर रहा हूँ।

अंतिम (# 3) में न केवल संग्रह (उदा। सूचियां) को संभालने की संभावना है, बल्कि स्ट्रीम (स्पष्ट रूप से उन्हें एकत्र किए बिना) को संभालने की संभावना है।

0

आप गिनती कलेक्टर का उपयोग कर सकते हैं।

Stream.of(1, 3, 4, 6, 7, 5, 6) 
      .collect(Collectors.groupingBy(
        Function.identity(), Collectors.counting())) 
      .entrySet().stream().anyMatch(e -> e.getValue() > 1) 
संबंधित मुद्दे