Làm cách nào để xóa các phần tử lặp lại khỏi ArrayList?


Câu trả lời:


991

Nếu bạn không muốn trùng lặp trong một Collection, bạn nên xem xét lý do tại sao bạn sử dụng một Collectionbản sao cho phép trùng lặp. Cách dễ nhất để loại bỏ các phần tử lặp lại là thêm nội dung vào một Set(sẽ không cho phép trùng lặp) và sau đó thêm phần Setsau vào ArrayList:

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

Tất nhiên, điều này phá hủy thứ tự của các yếu tố trong ArrayList.


260
Xem thêm LinkedHashset, nếu bạn muốn giữ lại đơn hàng.
bóng chuyền

3
@Chetan tìm tất cả các bản sao từ ArrayList trong O (n), điều quan trọng là phải xác định chính xác phương thức bằng trên các đối tượng mà bạn có trong danh sách (không có vấn đề gì về số): 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
Một thực hành tốt sẽ là xác định các biến bằng cách sử dụng các loại giao diện ListSet(thay vì các loại triển khai ArrayListHashSetnhư trong ví dụ của bạn).
Jonik

33
Bạn có thể dọn sạch cái này bằng cách sử dụng new HashSet(al)thay vì khởi tạo nó để trống và gọi addAll.
tro999

1
Tôi có thể thêm quy tắc để đặt những gì trùng lặp với tôi không? Ví dụ: khi Objectgiá trị của tôi có một vài giá trị nếu hai trong số chúng lặp lại, tôi coi chúng là trùng lặp (các giá trị khác có thể khác nhau) và sử dụng Set?
jean d'eve

290

Mặc dù chuyển đổi ArrayListmột HashSetcách hiệu quả loại bỏ bản sao, nếu bạn cần phải giữ gìn trật tự chèn, tôi thà khuyên bạn nên sử dụng phiên bản này

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

Sau đó, nếu bạn cần lấy lại Listtham chiếu, bạn có thể sử dụng lại hàm tạo chuyển đổi.


10
LinkedHashSet có đảm bảo bất kỳ bản sao nào trong số các bản sao được giữ trong danh sách không? Chẳng hạn, nếu vị trí 1, 3 và 5 là trùng lặp trong danh sách ban đầu, chúng ta có thể giả sử rằng quy trình này sẽ loại bỏ 3 và 5 không? Hoặc có thể loại bỏ 1 và 3? Cảm ơn.
Matt Briançon

16
@Matt: vâng, nó đảm bảo điều đó. Các tài liệu nói: "Danh sách được liên kết này xác định thứ tự lặp, là thứ tự mà các phần tử được chèn vào tập hợp (thứ tự chèn). Lưu ý rằng thứ tự chèn không bị ảnh hưởng nếu một phần tử được chèn lại vào tập hợp."
abahgat

Rất thú vị. Tôi có một tình huống khác ở đây. Tôi không cố gắng sắp xếp String nhưng một đối tượng khác gọi là AwardYearSource. Lớp này có một thuộc tính int được gọi là năm. Vì vậy, tôi muốn loại bỏ trùng lặp dựa trên năm. tức là nếu có năm 2010 được đề cập nhiều hơn một lần, tôi muốn xóa đối tượng AwardYearSource đó. Làm thế nào tôi có thể làm điều đó?
WowBow

@WowBow Ví dụ: bạn có thể xác định đối tượng Wrapper chứa AwardYearSource. Và định nghĩa các đối tượng Wrapper này bằng phương thức dựa trên trường năm AwardYearSource. Sau đó, bạn có thể sử dụng Set với các đối tượng Wrapper này.
Ondrej Bozek

@WowBow hoặc triển khai So sánh / So sánh
shrini1000

134

Trong Java 8:

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

Xin lưu ý rằng hợp đồng hashCode-Equals cho các thành viên trong danh sách nên được tôn trọng để bộ lọc hoạt động chính xác.


1
Làm thế nào để tôi làm điều này cho trường hợp không phân biệt?
StackFlowed

@StackFlowed Nếu bạn không cần phải giữ gìn trật tự của danh sách, bạn có thể addAllđến new TreeSet<String>(String.CASE_INSENSITIVE_ORDER). Phần tử đầu tiên được thêm sẽ vẫn còn trong tập hợp vì vậy nếu danh sách của bạn chứa "Dog" và "dog" (theo thứ tự đó) thì TreeSetsẽ chứa "Dog". Nếu thứ tự phải được bảo tồn thì trước khi dòng trong câu trả lời đặt list.replaceAll(String::toUpperCase);.
Paul

1
Tôi gặp lỗi này: các loại không tương thích: Danh sách <Đối tượng> không thể được chuyển đổi thành Danh sách <Chuỗi>
Samir

Đây là một giải pháp đơn giản nói chung nhưng làm thế nào để bạn loại bỏ các bản sao khỏi danh sách Array của int []?
Lập trình viên Nooby

56

Giả sử chúng ta có một danh sách Stringnhư:

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

Sau đó, chúng ta có thể loại bỏ các yếu tố trùng lặp theo nhiều cách.

Trước Java 8

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

Lưu ý: Nếu chúng tôi muốn duy trì thứ tự chèn thì chúng tôi cần sử dụngLinkedHashSet thay choHashSet

Sử dụng ổi

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

Sử dụng Java 8

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

Lưu ý: Trong trường hợp chúng tôi muốn thu thập kết quả trong việc thực hiện danh sách cụ thể, ví dụ: LinkedListsau đó chúng tôi có thể sửa đổi ví dụ trên như:

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

Chúng tôi cũng có thể sử dụng parallelStreamtrong đoạn mã trên nhưng nó có thể không mang lại lợi ích hiệu suất mong đợi. Kiểm tra câu hỏi này để biết thêm.


Yah, Khi tôi gõ những bình luận trước đây của mình, tôi đã có ấn tượng rằng parallel streamssẽ luôn mang lại hiệu quả tốt hơn. Nhưng đó là một huyền thoại. Sau này tôi mới biết rằng có một số kịch bản nhất định trong đó các luồng song song nên được sử dụng. Trong kịch bản này, các luồng song song sẽ không cho hiệu năng tốt hơn. và có các luồng song song có thể không cho kết quả mong muốn một số trường hợp. List<String> deDupStringList3 = stringList.stream().map(String::toLowerCase).distinct().collect(Collectors.toList());nên là giải pháp phù hợp trong trường hợp này
Diablo

53

Nếu bạn không muốn trùng lặp, hãy sử dụng Set thay vì a List. Để chuyển đổi a Listthành a, Setbạn có thể sử dụng đoạn mã sau:

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

Nếu thực sự cần thiết, bạn có thể sử dụng cùng một cấu trúc để chuyển đổi Settrở lại thành một List.


Tương tự ở dưới cùng của chuỗi, tôi đã đưa ra một câu trả lời trong đó tôi đang sử dụng Set for Custom Object. Trong trường hợp nếu bất kỳ ai có đối tượng tùy chỉnh như "Liên hệ" hoặc "Sinh viên" có thể sử dụng câu trả lời đó phù hợp với tôi.
Muhammad Adil

Vấn đề xảy ra khi bạn phải truy cập cụ thể một yếu tố. Chẳng hạn, khi ràng buộc một đối tượng vào chế độ xem danh sách trong Android, bạn được cung cấp chỉ mục của nó. Vì vậy, Setkhông thể được sử dụng ở đây.
TheRealChx101

Làm thế nào tôi có thể bỏ qua điều này khi danh sách là một danh sách đối tượng
jvargas

28

Bạn cũng có thể làm theo cách này và giữ trật tự:

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

Tôi nghĩ rằng đây là cách tốt nhất để loại bỏ trùng lặp trong một ArrayList. Chắc chắn đề nghị. Cảm ơn bạn @Nenad đã trả lời.
ByWaleed

25

Các luồng Java 8 cung cấp một cách rất đơn giản để loại bỏ các phần tử trùng lặp khỏi danh sách. Sử dụng phương pháp riêng biệt. Nếu chúng tôi có một danh sách các thành phố và chúng tôi muốn xóa các bản sao khỏi danh sách đó, nó có thể được thực hiện trong một dòng -

 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());

Cách xóa các phần tử trùng lặp khỏi danh sách mảng


25

Đây là một cách không ảnh hưởng đến thứ tự danh sách của bạn:

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);
}

l1 là danh sách ban đầu và l2 là danh sách không có các mục lặp lại (Đảm bảo YourClass có phương thức bằng theo những gì bạn muốn đại diện cho sự bình đẳng)


Câu trả lời này thiếu hai điều: 1) Nó không sử dụng generic, nhưng các kiểu thô ( ArrayList<T>nên được sử dụng thay vì ArrayList) 2) Có thể tránh việc tạo iterator rõ ràng bằng cách sử dụng a for (T current : l1) { ... }. Ngay cả khi bạn muốn sử dụng một Iteratorcách rõ ràng, iteradorlà sai chính tả.
RAnders00

4
Và việc thực hiện này chạy trong thời gian bậc hai, so với việc thực hiện bộ băm được liên kết đang chạy trong thời gian tuyến tính. (tức là việc này mất 10 lần trong danh sách với 10 phần tử, dài hơn 10.000 lần trong danh sách có 10.000 phần tử. Việc triển khai JDK 6 cho ArrayList.contains , JDK8 impl là như nhau.)
Patrick M

21

Có thể xóa các bản sao khỏi danh sách mảng mà không cần sử dụng Hashset hoặc thêm một danh sách mảng .

Hãy thử mã này ..

    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);

Đầu ra là

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

Nó chậm và bạn có thể nhận được một concExModificationException.
maaartinus

@maaartinus Bạn đã thử mã đó chưa? Nó sẽ không tạo ra bất kỳ ngoại lệ nào. Ngoài ra, nó khá nhanh. Tôi đã thử mã trước khi đăng.
CarlJohn

4
Bạn nói đúng, nó không giống như bạn lặp lại mảng thay vì danh sách. Tuy nhiên, nó chậm như địa ngục. Hãy thử nó với một vài triệu yếu tố. So sánh nó với ImmutableSet.copyOf(lst).toList().
maaartinus

trả lời câu hỏi tôi đã được hỏi trong cuộc phỏng vấn .. Cách xóa các giá trị lặp lại khỏi ArrayList mà không cần sử dụng Bộ. Thanx
Aniket Paul

Trong nội bộ, indexOflặp lại việc lstsử dụng một vòng lặp for.
Patrick M

21

Ngoài ra còn có ImmutableSettừ Guava như một tùy chọn ( đây là tài liệu):

ImmutableSet.copyOf(list);

1
Lưu ý rằng có một ImmutableSet.asList()phương thức, trả về một ImmutableList, nếu bạn cần nó trở lại như một List.
Andy Turner

19

điều này có thể giải quyết vấn đề:

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
Tôi thích giải pháp này tốt hơn.
Tushar Gogna

12

Có lẽ hơi quá mức, nhưng tôi thích loại vấn đề bị cô lập này. :)

Mã này sử dụng Bộ tạm thời (để kiểm tra tính duy nhất) nhưng loại bỏ các yếu tố trực tiếp trong danh sách ban đầu. Vì việc loại bỏ phần tử bên trong một ArrayList có thể tạo ra một lượng lớn sao chép mảng, nên việc loại bỏ (int) -method được tránh.

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);
    }
}

Trong khi chúng tôi đang ở đó, đây là phiên bản dành cho LinkedList (đẹp hơn rất nhiều!):

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();
        }
    }
}

Sử dụng giao diện đánh dấu để trình bày một giải pháp hợp nhất cho Danh sách:

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

EDIT: Tôi đoán các công cụ thuốc generic không thực sự bổ sung bất kỳ giá trị nào ở đây .. Oh tốt. :)


1
Tại sao sử dụng ArrayList trong tham số? Tại sao không chỉ là Danh sách? Điều đó sẽ không làm việc?
Shervin Asgari

Danh sách sẽ hoàn toàn hoạt động như tham số cho phương thức đầu tiên được liệt kê. Tuy nhiên, phương thức này được tối ưu hóa để sử dụng với danh sách truy cập ngẫu nhiên như ArrayList, vì vậy nếu LinkedList được thông qua thay vào đó bạn sẽ có hiệu suất kém. Ví dụ: việc đặt phần tử n: th trong LinkedList sẽ mất thời gian O (n), trong khi việc đặt phần tử n: th trong danh sách truy cập ngẫu nhiên (như ArrayList) sẽ mất thời gian O (1). Tuy nhiên, một lần nữa, điều này có thể là quá mức cần thiết ... Nếu bạn cần loại mã chuyên dụng này, hy vọng nó sẽ ở trong một tình huống bị cô lập.
bóng chuyền

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);
}

Việc triển khai này không trả về phần tử nào trong danh sách vì j--
neo7

1
Công việc triển khai này rất tốt. Không có vấn đề gì đằng sau việc này và đối với nhiệm vụ này tôi chỉ sử dụng một mảng. Vì vậy, câu trả lời này là hoàn toàn tốt. Trước khi đưa ra phản hồi tiêu cực, bạn cũng nên thêm testcase để mọi người đều có thể hiểu kết quả. Manash
Manash Ranjan Dakua

5

Nếu bạn sẵn sàng sử dụng thư viện của bên thứ ba, bạn có thể sử dụng phương thức này distinct()trong Bộ sưu tập Eclipse (trước đây là Bộ sưu tập GS).

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

Ưu điểm của việc sử dụng distinct()thay vì chuyển đổi thành Tập hợp rồi quay lại Danh sách là distinct()giữ nguyên thứ tự của Danh sách gốc, giữ lại lần xuất hiện đầu tiên của mỗi thành phần. Nó được thực hiện bằng cách sử dụng cả Tập hợp và Danh sách.

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;

Nếu bạn không thể chuyển đổi Danh sách ban đầu của mình thành loại Bộ sưu tập Eclipse, bạn có thể sử dụng ListAd CHƯƠNG để có cùng API.

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

Lưu ý: Tôi là người đi làm cho Bộ sưu tập Eclipse.


3

Ba dòng mã này có thể loại bỏ phần tử trùng lặp khỏi ArrayList hoặc bất kỳ bộ sưu tập nào.

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

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

2

Khi bạn điền vào ArrayList, hãy sử dụng một điều kiện cho mỗi phần tử. Ví dụ:

    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 + " ");     
    }

Chúng ta sẽ nhận được một mảng {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}


2

Nếu bạn muốn duy trì Đơn hàng của mình thì tốt nhất nên sử dụng LinkedHashset . Bởi vì nếu bạn muốn chuyển Danh sách này cho một Truy vấn Chèn bằng cách Lặp lại nó, thứ tự sẽ được giữ nguyên.

Thử cái này

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

Chuyển đổi này sẽ rất hữu ích khi bạn muốn trả về Danh sách nhưng không phải là Bộ.


2

Mã số:

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);

Lưu ý: Chắc chắn, sẽ có bộ nhớ trên đầu.


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 sẽ thực hiện các mẹo.

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());

// đầu ra: 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

Điều này được sử dụng cho danh sách Đối tượng tùy chỉnh của bạn

   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

bạn có thể sử dụng vòng lặp lồng nhau theo sau:

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

Như đã nói trước đây, bạn nên sử dụng một lớp thực hiện giao diện Set thay vì List để chắc chắn về tính độc nhất của các phần tử. Nếu bạn phải giữ thứ tự các thành phần, giao diện Sắp xếp có thể được sử dụng; lớp TreeSet thực hiện giao diện đó.


1

Nếu bạn đang sử dụng Danh sách loại mô hình <T> / ArrayList <T>. Hy vọng, nó sẽ giúp bạn.

Đây là mã của tôi mà không sử dụng bất kỳ cấu trúc dữ liệu nào khác như set hoặc hashmap

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

Nếu bạn muốn loại bỏ trùng lặp khỏi ArrayList có nghĩa là tìm logic bên dưới,

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
Tại sao bạn lại đăng một giải pháp bậc hai cho một câu hỏi đã có giải pháp tuyến tính và tuyến tính 2 năm tuổi, điều đó cũng đơn giản hơn?
abarnert
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.