मैं ArrayList से दोहराए गए तत्वों को कैसे निकालूं?


504

मेरे पास एक है ArrayList<String>, और मैं इसे बार-बार होने वाले तारों को दूर करना चाहता हूं। मैं यह कैसे कर सकता हूँ?

जवाबों:


991

यदि आप डुप्लिकेट नहीं चाहते हैं Collection, तो आपको यह विचार करना चाहिए कि आप Collectionडुप्लिकेट का उपयोग क्यों कर रहे हैं । बार-बार तत्वों को निकालने का सबसे आसान तरीका यह है कि सामग्री को एक में जोड़ा जाए Set(जो डुप्लिकेट की अनुमति नहीं देगा) और फिर Setवापस इसमें जोड़ें ArrayList:

Set<String> set = new HashSet<>(yourList);
yourList.clear();
yourList.addAll(set);

बेशक, यह तत्वों के क्रम को नष्ट कर देता है ArrayList


260
यदि आप ऑर्डर को बनाए रखना चाहते हैं, तो LinkedHashSet भी देखें।
वॉली

3
@ चेतन O (n) में ArrayList से सभी डुप्लिकेट ढूंढ रहा है, यह महत्वपूर्ण है कि वस्तुओं पर सही तरीके से परिभाषित की गई विधि जो आपके पास सूची में है (संख्या के लिए कोई समस्या नहीं): public Set<Object> findDuplicates(List<Object> list) { Set<Object> items = new HashSet<Object>(); Set<Object> duplicates = new HashSet<Object>(); for (Object item : list) { if (items.contains(item)) { duplicates.add(item); } else { items.add(item); } } return duplicates; }
Ondrej Bozek

4
एक अच्छा अभ्यास इंटरफ़ेस प्रकारों का उपयोग करके चर को परिभाषित करना होगा ( Listऔर Setकार्यान्वयन के प्रकारों के रूप में ArrayListऔर HashSetआपके उदाहरण में)।
जोनीक

33
new HashSet(al)इसे खाली करने और कॉल करने के लिए उपयोग करने के बजाय आप इसे साफ कर सकते हैं addAll
ashes999

1
क्या मैं अपने लिए डुप्लिकेट बनाने के लिए नियम जोड़ सकता हूं? उदाहरण के लिए: जब मेरे Objectकई मूल्य हैं यदि उनमें से दो दोहराते हैं तो मैं उन्हें डुप्लिकेट मानता हूं (अन्य मूल्य अलग हो सकते हैं) और उपयोग Set?
जीन डी

290

हालांकि ArrayListएक HashSetप्रभावी ढंग से परिवर्तित डुप्लिकेट को हटाता है, अगर आपको प्रविष्टि क्रम को संरक्षित करने की आवश्यकता है, तो मैं आपको इस संस्करण का उपयोग करने का सुझाव दूंगा

// list is some List of Strings
Set<String> s = new LinkedHashSet<>(list);

फिर, यदि आपको एक Listसंदर्भ वापस लेने की आवश्यकता है, तो आप फिर से रूपांतरण कंस्ट्रक्टर का उपयोग कर सकते हैं।


10
क्या LinkedHashSet ने इस बात की कोई गारंटी दी है कि कौन से डुप्लिकेट को सूची से रखा गया है? उदाहरण के लिए, यदि स्थिति 1, 3, और 5 मूल सूची में डुप्लिकेट हैं, तो क्या हम मान सकते हैं कि यह प्रक्रिया 3 और 5 को हटा देगी? या शायद 1 और 3 को हटा दें? धन्यवाद।
मैट ब्रायनकॉन

16
@ मैट: हाँ, यह गारंटी देता है कि। डॉक्स कहते हैं: "यह लिंक्ड सूची यात्रा आदेश है, जो जिस क्रम में तत्वों सेट (प्रविष्टि-आदेश) में डाला गया है परिभाषित करता है ध्यान दें कि यदि एक तत्व फिर से डाला सेट में है कि प्रविष्टि आदेश में प्रभावित नहीं है।।"
अबाहगट

बहुत ही रोचक। मेरी यहां एक अलग स्थिति है। मैं स्ट्रिंग को सॉर्ट करने की कोशिश नहीं कर रहा हूं, लेकिन एक अन्य वस्तु जिसे एवियरीसोर्स कहा जाता है। इस वर्ग में वर्ष नामक एक अंतर विशेषता है। इसलिए मैं वर्ष के आधार पर डुप्लिकेट को निकालना चाहता हूं। यानी यदि वर्ष 2010 में एक से अधिक बार उल्लेख किया गया है, तो मैं उस अवार्डस सोर्स को हटा देना चाहता हूं। मैं उसे कैसे कर सकता हूँ?
वाहबॉ

@WowBow उदाहरण के लिए आप Wrapper ऑब्जेक्ट को परिभाषित कर सकते हैं जो AwardYearSource रखता है। और इस रैपर ऑब्जेक्ट्स को परिभाषित करें वर्ष पुरस्कार क्षेत्र के आधार पर विधि के बराबर। फिर आप इन रैपर ऑब्जेक्ट्स के साथ सेट का उपयोग कर सकते हैं।
ओन्द्रेज बोजेक

@WowBow या तुलनीय / तुलनात्मक लागू करें
shrini1000

134

जावा 8 में:

List<String> deduped = list.stream().distinct().collect(Collectors.toList());

कृपया ध्यान दें कि सूची सदस्यों के लिए हैशकोड-समान अनुबंध ठीक से काम करने के लिए फ़िल्टरिंग के लिए सम्मानित किया जाना चाहिए।


1
केस असंवेदनशील विशिष्ट के लिए मैं यह कैसे करूं?
स्टैकफॉल्ग ने

@StackFlowed यदि आपको उस सूची के क्रम को संरक्षित करने की आवश्यकता नहीं है जिसे आप कर सकते addAllहैं new TreeSet<String>(String.CASE_INSENSITIVE_ORDER)। जोड़ा गया पहला तत्व सेट में रहेगा, यदि आपकी सूची में "डॉग" और "डॉग" (उस क्रम में) TreeSetमें "डॉग" होगा। यदि आदेश संरक्षित किया जाना चाहिए, तो उत्तर में लाइन से पहले list.replaceAll(String::toUpperCase);
पॉल

1
मुझे यह त्रुटि मिल रही है: असंगत प्रकार: सूची <ऑब्जेक्ट> को सूची में परिवर्तित नहीं किया जा सकता है <string>
Samir

यह सामान्य रूप से एक सरल उपाय है, लेकिन आप डुप्लिकेट को एक int [] के Arraylist से कैसे निकालते हैं?
नोबी प्रोग्रामर

56

मान लीजिए कि हमारे पास एक सूची है String:

List<String> strList = new ArrayList<>(5);
// insert up to five items to list.        

फिर हम कई तरीकों से डुप्लिकेट तत्वों को हटा सकते हैं।

जावा 8 से पहले

List<String> deDupStringList = new ArrayList<>(new HashSet<>(strList));

नोट: यदि हम प्रविष्टि क्रम को बनाए रखना चाहते हैं तो हमें इसके LinkedHashSetस्थान पर उपयोग करना होगाHashSet

अमरूद का उपयोग करना

List<String> deDupStringList2 = Lists.newArrayList(Sets.newHashSet(strList));

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

List<String> deDupStringList3 = strList.stream().distinct().collect(Collectors.toList());

नोट: मामले में हम एक में परिणाम एकत्र करना चाहते हैं विशिष्ट सूची कार्यान्वयन जैसे LinkedListफिर हम ऊपर के उदाहरण के रूप में संशोधित कर सकते हैं:

List<String> deDupStringList3 = strList.stream().distinct()
                 .collect(Collectors.toCollection(LinkedList::new));

हम parallelStreamउपरोक्त कोड में भी उपयोग कर सकते हैं लेकिन यह अपेक्षित प्रदर्शन लाभ नहीं दे सकता है। अधिक के लिए इस प्रश्न की जाँच करें ।


याह, जब मैंने अपनी पिछली टिप्पणियाँ टाइप कीं, तो मैं इस धारणा में था कि parallel streamsहमेशा बेहतर प्रदर्शन दूंगा। लेकिन यह एक मिथक है। मुझे बाद में पता चला कि कुछ निश्चित परिदृश्य हैं जहां समानांतर धाराओं का उपयोग किया जाना चाहिए। इस परिदृश्य में समानांतर धाराएं कोई बेहतर प्रदर्शन नहीं देंगी। और हाँ समानांतर धाराएँ कुछ मामलों में वांछित परिणाम नहीं दे सकती हैं। List<String> deDupStringList3 = stringList.stream().map(String::toLowerCase).distinct().collect(Collectors.toList());इस मामले में उपयुक्त समाधान होना चाहिए
डियाब्लो

53

यदि आप डुप्लिकेट नहीं चाहते हैं, तो इसके बजाय सेट का उपयोग करेंList । एक को बदलने के Listलिए Setआप निम्नलिखित कोड का उपयोग कर सकते हैं:

// list is some List of Strings
Set<String> s = new HashSet<String>(list);

यदि वास्तव में आवश्यक है तो आप उसी निर्माण का उपयोग कर सकते हैं ताकि Setपीठ को एक में परिवर्तित कर सकें List


इसी प्रकार धागे के नीचे, मैंने एक उत्तर दिया है जहां मैं कस्टम ऑब्जेक्ट के लिए सेट का उपयोग कर रहा हूं। ऐसे मामले में अगर किसी के पास "संपर्क" या "छात्र" जैसी कस्टम ऑब्जेक्ट है, तो उस उत्तर का उपयोग कर सकते हैं जो मेरे लिए ठीक काम करता है।
मुहम्मद आदिल

समस्या तब आती है जब आपको किसी तत्व को विशेष रूप से एक्सेस करना होता है। उदाहरण के लिए जब किसी वस्तु को एंड्रॉइड में किसी सूची आइटम दृश्य से बांधते हैं, तो आपको उसका इंडेक्स दिया जाता है। तो Setयहाँ इस्तेमाल नहीं किया जा सकता है।
TheRealChx101

जब सूची एक वस्तु सूची है तो मैं इसे कैसे प्राप्त कर सकता हूं

28

आप इसे इस तरह भी कर सकते हैं, और ऑर्डर को संरक्षित कर सकते हैं:

// delete duplicates (if any) from 'myArrayList'
myArrayList = new ArrayList<String>(new LinkedHashSet<String>(myArrayList));

मुझे लगता है कि यह एक ArrayList में डुप्लिकेट को हटाने का सबसे अच्छा तरीका है। निश्चित रूप से अनुशंसित। उत्तर के लिए धन्यवाद @Nenad
बवलेड

25

जावा 8 स्ट्रीम एक सूची से डुप्लिकेट तत्वों को हटाने के लिए एक बहुत ही सरल तरीका प्रदान करते हैं। अलग विधि का उपयोग कर। यदि हमारे पास शहरों की एक सूची है और हम उस सूची से डुप्लिकेट को हटाना चाहते हैं, तो इसे एक ही पंक्ति में किया जा सकता है -

 List<String> cityList = new ArrayList<>();
 cityList.add("Delhi");
 cityList.add("Mumbai");
 cityList.add("Bangalore");
 cityList.add("Chennai");
 cityList.add("Kolkata");
 cityList.add("Mumbai");

 cityList = cityList.stream().distinct().collect(Collectors.toList());

कैसे एक सरणी सूची से नकली तत्वों को हटाने के लिए


25

यहाँ एक तरीका है जो आपकी सूची क्रम को प्रभावित नहीं करता है:

ArrayList l1 = new ArrayList();
ArrayList l2 = new ArrayList();

Iterator iterator = l1.iterator();

while (iterator.hasNext()) {
    YourClass o = (YourClass) iterator.next();
    if(!l2.contains(o)) l2.add(o);
}

एल 1 मूल सूची है, और एल 2 दोहराई जाने वाली वस्तुओं के बिना सूची है (सुनिश्चित करें कि आपके पास समानता है जो आप समानता के लिए खड़े होना चाहते हैं, उसी के अनुसार विधि है)


इस उत्तर में दो चीजों का अभाव है: 1) यह जेनरिक का उपयोग नहीं करता है, लेकिन कच्चे प्रकार ( ArrayList<T>इसका उपयोग ArrayList2 के बजाय किया जाना चाहिए ) स्पष्ट इट्रेटर बनाने से इसका उपयोग करके बचा जा सकता है for (T current : l1) { ... }। यहां तक ​​कि अगर आप Iteratorस्पष्ट रूप से उपयोग करना चाहते थे , iteradorतो गलत वर्तनी है।
RAnders00

4
और यह कार्यान्वयन रैखिक समय में चल रहे लिंक किए गए हैश सेट कार्यान्वयन की तुलना में द्विघात समय में चलता है। (यानी यह 10 तत्वों के साथ एक सूची में 10 गुना अधिक समय लेता है, 10,000 तत्वों के साथ एक सूची पर 10,000 गुना अधिक है। JDK 6 को ArrayList.contains के लिए लागू किया जाता है , JDK8 का निहितार्थ समान है।)
पैट्रिक M

21

HashSet या एक और arraylist का उपयोग किए बिना arraylist से डुप्लिकेट को निकालना संभव है

इस कोड को आज़माएं ..

    ArrayList<String> lst = new ArrayList<String>();
    lst.add("ABC");
    lst.add("ABC");
    lst.add("ABCD");
    lst.add("ABCD");
    lst.add("ABCE");

    System.out.println("Duplicates List "+lst);

    Object[] st = lst.toArray();
      for (Object s : st) {
        if (lst.indexOf(s) != lst.lastIndexOf(s)) {
            lst.remove(lst.lastIndexOf(s));
         }
      }

    System.out.println("Distinct List "+lst);

आउटपुट है

Duplicates List [ABC, ABC, ABCD, ABCD, ABCE]
Distinct List [ABC, ABCD, ABCE]

यह धीमा है और आपको एक समवर्ती मेलोडीएक्स अपवाद मिल सकता है।
मातरिनस

@maaartinus क्या आपने वह कोड आज़माया है? यह किसी भी अपवाद का उत्पादन नहीं करेगा। इसके अलावा यह बहुत तेज है। मैंने पोस्ट करने से पहले कोड की कोशिश की।
कार्लजॉन

4
आप सही हैं, यह नहीं है क्योंकि आप सूची के बजाय सरणी को पुनरावृत्त करते हैं। हालांकि, यह नरक की तरह धीमा है। इसे कुछ लाखों तत्वों के साथ आज़माएँ। इसकी तुलना करें ImmutableSet.copyOf(lst).toList()
Maaartinus

साक्षात्कार में मुझसे जो सवाल पूछा गया था उसका उत्तर देता है .. सेट का उपयोग किए बिना एक ArrayList से दोहराए गए मूल्यों को कैसे हटाएं। थैंक्स
अनिकेत पॉल

आंतरिक रूप से, लूप के लिए उपयोग को indexOfपुनरावृत्त करता है lst
पैट्रिक एम


19

इससे समस्या हल हो सकती है:

private List<SomeClass> clearListFromDuplicateFirstName(List<SomeClass> list1) {

     Map<String, SomeClass> cleanMap = new LinkedHashMap<String, SomeClass>();
     for (int i = 0; i < list1.size(); i++) {
         cleanMap.put(list1.get(i).getFirstName(), list1.get(i));
     }
     List<SomeClass> list = new ArrayList<SomeClass>(cleanMap.values());
     return list;
}

1
मुझे यह समाधान बेहतर लगा।
तुषार गोगना

12

संभवत: थोड़ा ओवरकिल हो जाता है, लेकिन मैं इस तरह की अलग-थलग समस्या का आनंद लेता हूं। :)

यह कोड एक अस्थायी सेट (विशिष्ट जांच के लिए) का उपयोग करता है, लेकिन मूल सूची के अंदर सीधे तत्वों को हटा देता है। चूंकि ArrayList के अंदर एलिमेंट रिमूवल से भारी मात्रा में ऐरे को कॉपी किया जा सकता है, इसलिए रिम (int) -method से बचा जाता है।

public static <T> void removeDuplicates(ArrayList<T> list) {
    int size = list.size();
    int out = 0;
    {
        final Set<T> encountered = new HashSet<T>();
        for (int in = 0; in < size; in++) {
            final T t = list.get(in);
            final boolean first = encountered.add(t);
            if (first) {
                list.set(out++, t);
            }
        }
    }
    while (out < size) {
        list.remove(--size);
    }
}

जब हम इस पर हैं, यहाँ लिंक्डलिस्ट के लिए एक संस्करण है (एक बहुत अच्छा!):

public static <T> void removeDuplicates(LinkedList<T> list) {
    final Set<T> encountered = new HashSet<T>();
    for (Iterator<T> iter = list.iterator(); iter.hasNext(); ) {
        final T t = iter.next();
        final boolean first = encountered.add(t);
        if (!first) {
            iter.remove();
        }
    }
}

सूची के लिए एकीकृत समाधान प्रस्तुत करने के लिए मार्कर इंटरफ़ेस का उपयोग करें:

public static <T> void removeDuplicates(List<T> list) {
    if (list instanceof RandomAccess) {
        // use first version here
    } else {
        // use other version here
    }
}

संपादित करें: मुझे लगता है कि जेनरिक-सामान वास्तव में यहाँ कोई मूल्य नहीं जोड़ते हैं .. ओह अच्छी तरह से। :)


1
पैरामीटर में ArrayList का उपयोग क्यों करें? सिर्फ सूची क्यों नहीं? क्या वह काम नहीं करेगा?
शेरविन असगरी

एक सूची पूरी तरह से सूचीबद्ध पहली विधि के लिए पैरामीटर के रूप में काम करेगी । इस विधि को अर्रेस्टलिस्ट जैसे यादृच्छिक अभिगमन सूची के साथ उपयोग करने के लिए अनुकूलित किया गया है, इसलिए यदि लिंकडलिस्ट को पास किया जाता है तो आपको खराब प्रदर्शन मिलेगा। उदाहरण के लिए, LinkedList में n: th एलिमेंट सेट करने में O (n) समय लगता है, जबकि n: th एलिमेंट को यादृच्छिक एक्सेस लिस्ट (जैसे ArrayList) में सेट करने में O (1) समय लगता है। फिर, हालांकि, यह संभवतः ओवरकिल है ... यदि आपको इस तरह के विशेष कोड की आवश्यकता है, तो यह उम्मीद है कि एक अलग स्थिति में होगा।
वॉली

10
public static void main(String[] args){
    ArrayList<Object> al = new ArrayList<Object>();
    al.add("abc");
    al.add('a');
    al.add('b');
    al.add('a');
    al.add("abc");
    al.add(10.3);
    al.add('c');
    al.add(10);
    al.add("abc");
    al.add(10);
    System.out.println("Before Duplicate Remove:"+al);
    for(int i=0;i<al.size();i++){
        for(int j=i+1;j<al.size();j++){
            if(al.get(i).equals(al.get(j))){
                al.remove(j);
                j--;
            }
        }
    }
    System.out.println("After Removing duplicate:"+al);
}

इस कार्यान्वयन की सूची में अंतिम j-- की वजह से कोई तत्व नहीं है
neo7

1
यह कार्यान्वयन कार्य बहुत ही बढ़िया है। इसके पीछे कोई समस्या नहीं है और इस कार्य के लिए मैं केवल एक arraylist का उपयोग कर रहा हूं। इस उत्तर को पूरी तरह से अच्छा माना जाता है। नकारात्मक प्रतिक्रिया देने के कारण आप टेस्टकेस भी जोड़ते हैं ताकि हर एक परिणाम को समझ सके। धन्यवाद मानश
मानश रंजन Dakua

5

यदि आप किसी तृतीय-पक्ष लाइब्रेरी का उपयोग करने के इच्छुक हैं, तो आप ग्रहण संग्रह (पूर्व में जीएस संग्रह) distinct()में विधि का उपयोग कर सकते हैं ।

ListIterable<Integer> integers = FastList.newListWith(1, 3, 1, 2, 2, 1);
Assert.assertEquals(
    FastList.newListWith(1, 3, 2),
    integers.distinct());

distinct()किसी सेट में और फिर वापस सूची में परिवर्तित करने के बजाय उपयोग करने का लाभ यह है कि distinct()प्रत्येक सूची की पहली घटना को बरकरार रखते हुए, मूल सूची के आदेश को संरक्षित रखता है। यह एक सेट और एक सूची दोनों का उपयोग करके कार्यान्वित किया जाता है।

MutableSet<T> seenSoFar = UnifiedSet.newSet();
int size = list.size();
for (int i = 0; i < size; i++)
{
    T item = list.get(i);
    if (seenSoFar.add(item))
    {
        targetCollection.add(item);
    }
}
return targetCollection;

यदि आप अपनी मूल सूची को ग्रहण संग्रहों में परिवर्तित नहीं कर सकते हैं, तो आप समान API प्राप्त करने के लिए ListAdapter का उपयोग कर सकते हैं।

MutableList<Integer> distinct = ListAdapter.adapt(integers).distinct();

नोट: मैं एक्लिप्स कलेक्शंस के लिए कमिट हूं।


3

कोड की यह तीन पंक्तियाँ ArrayList या किसी भी संग्रह से डुप्लिकेट किए गए तत्व को निकाल सकती हैं।

List<Entity> entities = repository.findByUserId(userId);

Set<Entity> s = new LinkedHashSet<Entity>(entities);
entities.clear();
entities.addAll(s);

2

जब आप ArrayList भर रहे हों, तो प्रत्येक तत्व के लिए एक शर्त का उपयोग करें। उदाहरण के लिए:

    ArrayList< Integer > al = new ArrayList< Integer >(); 

    // fill 1 
    for ( int i = 0; i <= 5; i++ ) 
        if ( !al.contains( i ) ) 
            al.add( i ); 

    // fill 2 
    for (int i = 0; i <= 10; i++ ) 
        if ( !al.contains( i ) ) 
            al.add( i ); 

    for( Integer i: al )
    {
        System.out.print( i + " ");     
    }

हम एक सरणी {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10} प्राप्त करेंगे


2

यदि आप अपने ऑर्डर को संरक्षित करना चाहते हैं तो लिंक्डहैशसेट का उपयोग करना सबसे अच्छा है । क्योंकि यदि आप इस सूची को Iterating द्वारा एक सम्मिलित क्वेरी में पास करना चाहते हैं, तो आदेश संरक्षित किया जाएगा।

इसे इस्तेमाल करे

LinkedHashSet link=new LinkedHashSet();
List listOfValues=new ArrayList();
listOfValues.add(link);

यह रूपांतरण तब बहुत सहायक होगा जब आप एक सूची नहीं बल्कि एक सेट लौटना चाहते हैं।


2

कोड:

List<String> duplicatList = new ArrayList<String>();
duplicatList = Arrays.asList("AA","BB","CC","DD","DD","EE","AA","FF");
//above AA and DD are duplicate
Set<String> uniqueList = new HashSet<String>(duplicatList);
duplicatList = new ArrayList<String>(uniqueList); //let GC will doing free memory
System.out.println("Removed Duplicate : "+duplicatList);

नोट: निश्चित रूप से, मेमोरी ओवरहेड होगी।


2
ArrayList<String> city=new ArrayList<String>();
city.add("rajkot");
city.add("gondal");
city.add("rajkot");
city.add("gova");
city.add("baroda");
city.add("morbi");
city.add("gova");

HashSet<String> hashSet = new HashSet<String>();
hashSet.addAll(city);
city.clear();
city.addAll(hashSet);
Toast.makeText(getActivity(),"" + city.toString(),Toast.LENGTH_SHORT).show();

1

LinkedHashSet ट्रिक करेगा।

String[] arr2 = {"5","1","2","3","3","4","1","2"};
Set<String> set = new LinkedHashSet<String>(Arrays.asList(arr2));
for(String s1 : set)
    System.out.println(s1);

System.out.println( "------------------------" );
String[] arr3 = set.toArray(new String[0]);
for(int i = 0; i < arr3.length; i++)
     System.out.println(arr3[i].toString());

// आउटपुट: 5,1,2,3,4


1
        List<String> result = new ArrayList<String>();
        Set<String> set = new LinkedHashSet<String>();
        String s = "ravi is a good!boy. But ravi is very nasty fellow.";
        StringTokenizer st = new StringTokenizer(s, " ,. ,!");
        while (st.hasMoreTokens()) {
            result.add(st.nextToken());
        }
         System.out.println(result);
         set.addAll(result);
        result.clear();
        result.addAll(set);
        System.out.println(result);

output:
[ravi, is, a, good, boy, But, ravi, is, very, nasty, fellow]
[ravi, is, a, good, boy, But, very, nasty, fellow]

1

इसका उपयोग आपकी कस्टम ऑब्जेक्ट सूची के लिए किया जाता है

   public List<Contact> removeDuplicates(List<Contact> list) {
    // Set set1 = new LinkedHashSet(list);
    Set set = new TreeSet(new Comparator() {

        @Override
        public int compare(Object o1, Object o2) {
            if (((Contact) o1).getId().equalsIgnoreCase(((Contact) o2).getId()) /*&&
                    ((Contact)o1).getName().equalsIgnoreCase(((Contact)o2).getName())*/) {
                return 0;
            }
            return 1;
        }
    });
    set.addAll(list);

    final List newList = new ArrayList(set);
    return newList;
}

1

आप अनुसरण में नेस्टेड लूप का उपयोग कर सकते हैं:

ArrayList<Class1> l1 = new ArrayList<Class1>();
ArrayList<Class1> l2 = new ArrayList<Class1>();

        Iterator iterator1 = l1.iterator();
        boolean repeated = false;

        while (iterator1.hasNext())
        {
            Class1 c1 = (Class1) iterator1.next();
            for (Class1 _c: l2) {
                if(_c.getId() == c1.getId())
                    repeated = true;
            }
            if(!repeated)
                l2.add(c1);
        }

1

जैसा कि पहले कहा गया है, आपको तत्वों की एकता के बारे में सुनिश्चित करने के लिए सूची के बजाय सेट इंटरफ़ेस को लागू करने वाले वर्ग का उपयोग करना चाहिए। यदि आपको तत्वों का क्रम रखना है, तो SortedSet इंटरफ़ेस का उपयोग किया जा सकता है; ट्रीसेट क्लास उस इंटरफ़ेस को लागू करता है।


1

यदि आप मॉडल प्रकार की सूची का उपयोग कर रहे हैं <T> / ArrayList <T>। आशा है, यह आपकी मदद करेगा।

सेट या हैशमैप जैसी किसी अन्य डेटा संरचना का उपयोग किए बिना यहां मेरा कोड है

for (int i = 0; i < Models.size(); i++){
for (int j = i + 1; j < Models.size(); j++) {       
 if (Models.get(i).getName().equals(Models.get(j).getName())) {    
 Models.remove(j);
   j--;
  }
 }
}

0
for(int a=0;a<myArray.size();a++){
        for(int b=a+1;b<myArray.size();b++){
            if(myArray.get(a).equalsIgnoreCase(myArray.get(b))){
                myArray.remove(b); 
                dups++;
                b--;
            }
        }
}

0
import java.util.*;
class RemoveDupFrmString
{
    public static void main(String[] args)
    {

        String s="appsc";

        Set<Character> unique = new LinkedHashSet<Character> ();

        for(char c : s.toCharArray()) {

            System.out.println(unique.add(c));
        }
        for(char dis:unique){
            System.out.println(dis);
        }


    }
}

0
public Set<Object> findDuplicates(List<Object> list) {
        Set<Object> items = new HashSet<Object>();
        Set<Object> duplicates = new HashSet<Object>();
        for (Object item : list) {
            if (items.contains(item)) {
                duplicates.add(item);
                } else { 
                    items.add(item);
                    } 
            } 
        return duplicates;
        }

0
    ArrayList<String> list = new ArrayList<String>();
    HashSet<String> unique = new LinkedHashSet<String>();
    HashSet<String> dup = new LinkedHashSet<String>();
    boolean b = false;
    list.add("Hello");
    list.add("Hello");
    list.add("how");
    list.add("are");
    list.add("u");
    list.add("u");

    for(Iterator iterator= list.iterator();iterator.hasNext();)
    {
        String value = (String)iterator.next();
        System.out.println(value);

        if(b==unique.add(value))
            dup.add(value);
        else
            unique.add(value);


    }
    System.out.println(unique);
    System.out.println(dup);

0

यदि आप ArrayList से डुप्लिकेट निकालना चाहते हैं, तो नीचे दिए गए तर्क खोजें,

public static Object[] removeDuplicate(Object[] inputArray)
{
    long startTime = System.nanoTime();
    int totalSize = inputArray.length;
    Object[] resultArray = new Object[totalSize];
    int newSize = 0;
    for(int i=0; i<totalSize; i++)
    {
        Object value = inputArray[i];
        if(value == null)
        {
            continue;
        }

        for(int j=i+1; j<totalSize; j++)
        {
            if(value.equals(inputArray[j]))
            {
                inputArray[j] = null;
            }
        }
        resultArray[newSize++] = value;
    }

    long endTime = System.nanoTime()-startTime;
    System.out.println("Total Time-B:"+endTime);
    return resultArray;
}

1
आप एक प्रश्न के लिए द्विघात समाधान क्यों पोस्ट करेंगे जिसमें पहले से ही 2-वर्षीय रैखिक और लॉग-रैखिक समाधान हैं, जो कि सरल भी हैं?
बजे
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.