Поиск дубликатов в ArrayList (JFrame) - PullRequest
0 голосов
/ 05 мая 2020

Я пытаюсь создать приложение Swing, которое добавляет имена в ArrayList, а затем отображает его в Jcombobox. Я уже сделал окно и все остальное, но, похоже, я не могу оторваться от обнаружения повторяющихся имен.

Я пробовал

    btnnext.addActionListener(new ActionListener() { 
    Override
    public void actionPerformed(ActionEvent e) {

    if(checkDuplicate(names)==true)
    {
    names.add(txtname.getText());
    txtname.setText("");
    }
    else {

    JOptionPane.showMessageDialog(null,"DUPLICATE! do not add");
    }
    }
    });



    public static boolean checkDuplicate(ArrayList<String> list) {
    HashSet set = new HashSet();
    for (int i = 0; i < list.size(); i++) {
    boolean val = set.add(list.get(i));
    if (val == false) {
    return val;
    }
    }
    return true;
    }

Он только говорит, что у меня есть дубликат, когда я уже добавляю его в ArrayList, и когда я получаю сообщение, я не могу ничего добавить.

input пример:

test

test


, а затем он перестает принимать новые строки и отображает только сообщение DUPLICATE! не добавляйте

1 Ответ

2 голосов
/ 05 мая 2020

Как я сказал в своем комментарии:

Это происходит потому, что вы в основном создаете Set представление своего ArrayList каждый раз, когда вызываете checkDuplicate, а не сравниваете элемент, который вы ' повторно пытаюсь добавить с существующим списком. Другими словами, ваш checkDuplicate написан так, что он возвращает истину только в том случае, если дубликат уже существует в списке. Вместо этого вам нужно сравнить новый элемент со списком. Пройдите через свой logi c осторожно либо с помощью отладчика, либо вручную записав значения ваших переменных, и вы увидите проблему.

Вы можете просто изменить эту строку:

if(checkDuplicate(names)==true)

на это:

if(!names.contains(txtname.getText()))

Вам действительно не нужно checkDuplicate, так как это, так сказать, «изобретать колесо». ArrayList уже предоставляет метод contains , который вы можете использовать в своих интересах.

...