как удалить дубликаты массива - PullRequest
3 голосов
/ 24 января 2011

Я выполняю некоторые задачи по обслуживанию старой системы. У меня есть arraylist, который содержит следующие значения:

a,b,12
c,d,3
b,a,12
d,e,3
a,b,12

Я использовал следующий код для удаления повторяющихся значений из массива

ArrayList<String> arList;
  public static void removeDuplicate(ArrayList arlList)
  {
   HashSet h = new HashSet(arlList);
   arlList.clear();
   arlList.addAll(h);
  }

Работает нормально, если находит одинаковые повторяющиеся значения. Однако, если вы внимательно посмотрите мои данные, Есть несколько повторяющихся записей, но не в том же порядке. Например, a, b, 12 и b, a, 12 являются то же самое, но в другом порядке.

Как удалить дубликаты записей такого типа из массива?

Спасибо

Ответы [ 5 ]

3 голосов
/ 24 января 2011

Предполагая, что записи являются String. Затем вы можете отсортировать каждую запись, а затем выполнить проверку дубликатов. Затем вы можете сохранить запись на карте и использовать ключ (ключ), чтобы увидеть, существуют ли они.

РЕДАКТИРОВАТЬ: добавлен полный пример кода.

public class Test {

    /**
     * @param args
     */
    public static void main(String[] args) {
        Test test = new Test();
        List<String> someList = new ArrayList<String>(); 
        someList.add("d,e,3");
        someList.add("a,b,12");
        someList.add("c,d,3");
        someList.add("b,a,12");
        someList.add("a,b,12");
            //using a TreeMap since you care about the order
        Map<String,String> dupMap = new TreeMap<String,String>();
        String key = null;
        for(String some:someList){
            key = test.sort(some);
            if(key!=null && key.trim().length()>0 && !dupMap.containsKey(key)){
                dupMap.put(key, some);
            }
        }
        List<String> uniqueList = new ArrayList<String>(dupMap.values());
        for(String unique:uniqueList){
            System.out.println(unique);
        }

    }
    private String sort(String key) {
      if(key!=null && key.trim().length()>0){
        char[] keys = key.toCharArray();
        Arrays.sort(keys);
        return String.valueOf(keys);
      }
      return null;
   }
}

Печать:

а, б, 12

C, D, 3

д, е, 3

2 голосов
/ 24 января 2011

Оберните элемент как «Foo» вместо «String», остальная часть кода «removeDuplicate» остается:

public class Foo {
    private String s1;
    private String s2;
    private String s3;

    public Foo(String s1, String s2, String s3) {
     this.s1 = s1;
     this.s2 = s2;
     this.s3 = s3;
    }

 @Override
    public int hashCode() {
     final int prime = 31;
     int result = 1;
     result = prime * result + ((s1 == null) ? 0 : s1.hashCode());
     result = prime * result + ((s2 == null) ? 0 : s2.hashCode());
     result = prime * result + ((s3 == null) ? 0 : s3.hashCode());
     return result;
    }

 @Override
    public boolean equals(Object obj) {
     if (this == obj)
      return true;
     if (obj == null)
      return false;
     if (getClass() != obj.getClass())
      return false;
     Foo other = (Foo) obj;
     //Notice here: 'a,b,12' and 'b,a,12' will be same
     if(fieldsAsList().containsAll(other.fieldsAsList())){
      return true;
     }

     return false;
    }

 private List<String> fieldsAsList(){
  ArrayList<String> l = new ArrayList<String>(3);
  l.add(s1);
     l.add(s2);
     l.add(s3);
     return l;
 }    
}

Тогда arList будет ArrayList < Foo>.

1 голос
/ 18 октября 2013

Попробуйте это простое решение ... (Не используется интерфейс Set)

https://stackoverflow.com/a/19434592/369035

1 голос
/ 24 января 2011

Создайте класс, чтобы обернуть строку строки (триплет), чтобы обеспечить вашу семантику равенства. Реализуйте методы equals () и hashCode (). Затем используйте метод HashSet для удаления дубликатов.

0 голосов
/ 25 ноября 2014

В ArrayList у нас нет возможности удалить дубликаты элементов напрямую.Мы можем достичь этого с помощью наборов, потому что наборы не допускают дублирования, поэтому лучше использовать классы HashSet или LinkedHashSet.См ссылка .

...