Java: Обнаружить дубликаты в ArrayList? - PullRequest
89 голосов
/ 19 февраля 2009

Как я могу обнаружить (вернуть true / false), содержит ли ArrayList более одного и того же элемента в Java?

Большое спасибо, Терри

Редактировать Забыл упомянуть, что я не хочу сравнивать «блоки» друг с другом, но их целочисленные значения. Каждый «блок» имеет int, и это то, что отличает их. Я нахожу int конкретного блока, вызывая метод с именем "getNum" (например, table1 [0] [2] .getNum ();

Ответы [ 15 ]

1 голос
/ 03 февраля 2012

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

 public Set<?> findDuplicatesInList(List<?> beanList) {
    System.out.println("findDuplicatesInList::"+beanList);
    Set<Object> duplicateRowSet=null;
    duplicateRowSet=new LinkedHashSet<Object>();
            for(int i=0;i<beanList.size();i++){
                Object superString=beanList.get(i);
                System.out.println("findDuplicatesInList::superString::"+superString);
                for(int j=0;j<beanList.size();j++){
                    if(i!=j){
                         Object subString=beanList.get(j);
                         System.out.println("findDuplicatesInList::subString::"+subString);
                         if(superString.equals(subString)){
                             duplicateRowSet.add(beanList.get(j));
                         }
                    }
                }
            }
            System.out.println("findDuplicatesInList::duplicationSet::"+duplicateRowSet);
        return duplicateRowSet;
  }
0 голосов
/ 10 июня 2019

Этот ответ написан на Kotlin, но может быть легко переведен на Java.

Если размер вашего arraylist находится в пределах фиксированного небольшого диапазона, то это отличное решение.

var duplicateDetected = false
    if(arrList.size > 1){
        for(i in 0 until arrList.size){
            for(j in 0 until arrList.size){
                if(i != j && arrList.get(i) == arrList.get(j)){
                    duplicateDetected = true
                }
            }
        }
    }
0 голосов
/ 04 июля 2017
    ArrayList<String> withDuplicates = new ArrayList<>();
    withDuplicates.add("1");
    withDuplicates.add("2");
    withDuplicates.add("1");
    withDuplicates.add("3");
    HashSet<String> set = new HashSet<>(withDuplicates);
    ArrayList<String> withoutDupicates = new ArrayList<>(set);

    ArrayList<String> duplicates = new ArrayList<String>();

    Iterator<String> dupIter = withDuplicates.iterator();
    while(dupIter.hasNext())
    {
    String dupWord = dupIter.next();
    if(withDuplicates.contains(dupWord))
    {
        duplicates.add(dupWord);
    }else{
        withoutDupicates.add(dupWord);
    }
    }
  System.out.println(duplicates);
  System.out.println(withoutDupicates);
0 голосов
/ 10 ноября 2014
/**
     * Method to detect presence of duplicates in a generic list. 
     * Depends on the equals method of the concrete type. make sure to override it as required.
     */
    public static <T> boolean hasDuplicates(List<T> list){
        int count = list.size();
        T t1,t2;

        for(int i=0;i<count;i++){
            t1 = list.get(i);
            for(int j=i+1;j<count;j++){
                t2 = list.get(j);
                if(t2.equals(t1)){
                    return true;
                }
            }
        }
        return false;
    }

Пример конкретного класса, который переопределил equals():

public class Reminder{
    private long id;
    private int hour;
    private int minute;

    public Reminder(long id, int hour, int minute){
        this.id = id;
        this.hour = hour;
        this.minute = minute;
    }

    @Override
    public boolean equals(Object other){
        if(other == null) return false;
        if(this.getClass() != other.getClass()) return false;
        Reminder otherReminder = (Reminder) other;
        if(this.hour != otherReminder.hour) return false;
        if(this.minute != otherReminder.minute) return false;

        return true;
    }
}
0 голосов
/ 30 октября 2013
    String tempVal = null;
    for (int i = 0; i < l.size(); i++) {
        tempVal = l.get(i); //take the ith object out of list
        while (l.contains(tempVal)) {
            l.remove(tempVal); //remove all matching entries
        }
        l.add(tempVal); //at last add one entry
    }

Примечание: это сильно повлияет на производительность, так как элементы удаляются из начала списка. Для решения этой проблемы у нас есть два варианта. 1) повторять в обратном порядке и удалять элементы. 2) Используйте LinkedList вместо ArrayList. Из-за предвзятых вопросов, задаваемых в интервью для удаления дубликатов из Списка без использования какой-либо другой коллекции, приведенным выше примером является ответ. Однако в реальном мире, если мне нужно этого добиться, я просто помещу элементы из списка в набор!

...