как получить дублированный и не дублированный элемент arrayList? - PullRequest
2 голосов
/ 22 декабря 2011

У меня есть объект Riziv с тремя переменными, такими как id, cnk и product.Затем я ищу в банке данных этот объект и добавляю его в список ArrayList как ArrayList<Riziv>.
Теперь я должен проверить, все ли объекты в его массиве совпадают cnk, затем вернуть true, иначе я должен вернуть всеобъекты, которые не совпадают cnk с сообщением об ошибке.

  public class Riziv{ String id, cnk, product; }
    ArrayList<Riziv> list = getArrayListFromDatabank(id);

    public void getDuplicatedWhichHasTheSameCnk(){

    }
  }

Ответы [ 3 ]

2 голосов
/ 22 декабря 2011

Я не совсем точно понимаю, что вы хотите, однако я подозреваю, что вы хотите что-то вроде этого.

MultiMap<Key, Riziv> multiMap = 
List<Riziv> list = 
for(Riziv r: list)
   multiMap.put(r.getCnk(), r);

for(Key cnk: multiMap.keySet()) {
    Collection<Riziv> sameCnk = multiMap.get(cnk);
    // check size and compare entries
}

На мультикарте будет список объектов Riziv для каждого Cnk.

1 голос
/ 22 декабря 2011

Один из способов сделать это - написать компаратор, чтобы отсортировать список по cnk String, а затем сравнить каждую последовательную cnk String со следующей, если вы найдете дубликат, они будут рядом друг с другом.

1.) Сортируйте список с помощью компаратора путем сортировки по переменной cnk.

2.) Сравните каждый элемент в списке на наличие дубликатов.

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

Я не проверял это, так что вы были предупреждены LOL:

ArrayList<Riziv> rizArray = new ArrayList<Riziv>();
        //Sort the array by the CNK variable.
        Collections.sort(rizArray, new Comparator<Riziv>(){
            @Override
            public int compare(Riziv arg0, Riziv arg1) {
                //Return the comparison of the Strings.
                //Use .compareToIgnoreCase if you want to ignore upper/lower case.
                return arg0.getCnk().compareTo(arg1.getCnk());
            }
        });
        //List should be in alphabetical order at this point.
        List<Riziv> duplicates = new ArrayList<Riziv>();
        Riziv rizPrevious = null;
        for(Riziv riz: rizArray){
            if(rizPrevious == null){
                rizPrevious = riz;
                continue;
            }
            if(riz.getCnk().compareTo(rizPrevious.getCnk()) == 0){
                duplicates.add(riz);
            }
            rizPrevious = riz;
        }
1 голос
/ 22 декабря 2011

Используя стандартные структуры JVM (MultiMap предоставляется guava), вы можете сделать это:

public List<Riviz> getDuplicates(final List<Riviz> l)
{
    final HashMap<String, List<Riviz>> m = new HashMap<String, List<Riviz>>();
    final List<Riviz> ret = new ArrayList<Riviz>();

    String cnk;

    for (final Riviz r: l) {
        cnk = r.getCnk();
        if (!m.contains(cnk))
            m.add(cnk, new ArrayList<Riviz>());
        m.get(cnk).add(r);            
    }

    List<Riviz> tmp;
    for (final Map.Entry<String, List<Riviz>> entry: m.entrySet()) {
        tmp = entry.getValue();
        if (tmp.size() == 1) // no dups
            continue;
        ret.addAll(tmp);
    }

    return ret;
}

ret будет содержать дубликаты. Вы можете изменить эту функцию, чтобы вместо нее возвращать Map<String, Riviz>, и отфильтровывать записи, в которых размер списка равен только одному. Затем вы получите карту с конфликтующими символами cnks в качестве ключей и списком дуплетов в качестве значений.

...