2013-12-16 2 views
6

Я пытаюсь предотвратить добавление повторяющихся записей в ArrayList, поскольку список заполняется при чтении каждой строки файла. Каждая строка файла находится в формате «node1 node2» (разделитель табуляции). Дубликат здесь может быть либо «node1 node2», либо «node2 node1». Вот мой код, чтобы попытаться выполнить эту операцию:JAVA: предотвращение дублирования записей в ArrayList

while((line = bufferedReader.readLine()) != null) { 

    String delimiter = "\t"; 
    String[] tempnodelist; 
    tempnodelist = line.split(delimiter); 

    for (int i=0; i <= edgesnumber; i++) { //edgesnumber = edges.size() 

     if (tempnodelist[0] && tempnodelist[1] != edges.get(i)) { 

      edges.add(line); 

      } 
     } 

    nodes.add(tempnodelist[0]); 
    nodes.add(tempnodelist[1]); //intial intended use of tempnodelist. 

}

Так как я уже разделив каждую линию, чтобы сделать HashSet каждого узла, я пытаюсь использовать это, чтобы проверить наличие дубликатов , На данный момент я просто не могу получить синтаксис правильно. Как я могу проверить предыдущие записи ArrayList для дубликатов и не допустить их добавления, а whist продолжает заполнять ArrayList? что не так с этим кодом в настоящее время?

Пожалуйста, задавайте любые вопросы, если что-то неясно,

Спасибо заранее!

+4

Если вы не хотите, повторяющиеся записи, то вы хотите 'Set', а не' list'. –

+0

Но записи могут быть отменены, и все равно будет считаться дубликатом ... Set не видел бы этого? – user2941526

+0

Набор использует 'equals()' для поиска дубликатов. Вы должны создать определенный класс для объекта, который хотите поместить в свой набор, и переопределить 'equals()' в этом классе. –

ответ

12

Используйте LinkedHashSet, а затем преобразовать его в ArrayList, так как LinkedHashSet имеет предсказуемый порядок итерации (вставка порядка), и это Set.

Например

LinkedHashSet<String> uniqueStrings = new LinkedHashSet<String>(); 

uniqueStrings.add("A"); 
uniqueStrings.add("B"); 
uniqueStrings.add("B"); 
uniqueStrings.add("C"); 
uniqueStrings.add("A"); 

List<String> asList = new ArrayList<String>(uniqueStrings); 
System.out.println(asList); 

выход будет

[A, B, C] 
+0

Я хочу использовать это с ArrayList с объектом класса, это не сработало. –

+0

@AnantShah Вы хотите уникальные объекты 'Class' в' ArrayList'? Это то, что вы имеете в виду? А что не получилось? Когда я пытаюсь, он работает. Наверное, вам сложно помочь в комментариях. Задайте вопрос и укажите пример кода. –

+0

Я попытался, и он возвратил тот же размер arraylist, у которого есть повторяющиеся данные объекта класса. Но для этого я переопределяю два метода equals() и hashCode() внутри объектного файла класса. и тогда это сработало. Спасибо за ваше решение и оперативный ответ. :) –

0

Во-первых, используйте равно для сравнения строк.

Во-вторых, вы можете использовать Set, а не Список

И, наконец, вы можете использовать contains метод, чтобы проверить, если элемент уже существует.

1

Для каждого добавления в ArrayList вам необходимо будет перебирать все предыдущие записи и проверить, существует ли запись с дубликатами (вы можете использовать .contains()), которая является O (N).

Лучше Я бы предложил использовать набор.

2

Если вы хотите сохранить порядок строк читать продолжать использовать список, но для дубликатов вы можете использовать набор для определения, если строка (в двух его формах, как вы описали) уже добавлен:

Set<String> duplicates = new HashSet<String>(); 
while((line = bufferedReader.readLine()) != null) { 

    String delimiter = "\t"; 
    String[] tempnodelist; 
    tempnodelist = line.split(delimiter); 

    String lineReversed = tempnodelist[1] + delimiter + tempnodelist[0]; 

    if (!duplicates.contains(line) && !duplicates.contains(lineReversed)) { 
     edges.add(line); 
    } 
} 
+0

reverse() превратит «node2 node1» в «1edon 2edon». Должно ли 'duplicates' быть вне цикла? –

+1

oh right ... я исправлю это – giorashc

+0

По какой-то причине это не предотвращает добавление дубликатов. Ввод txt из «123 234» и «234 123» по-прежнему заполнял ArrayList двумя записями:/ – user2941526

-1

Похоже, что вы действительно хотите это Set<Set<String>>

Set<Set<String>> pairs = ... 
try(BufferedReader br = ...) { 
    for(String line; (line = br.readLine()) != null;) 
     pairs.add(new HashSet<String>(Arrays.asList(line.split(" "))); 
} 

Это создает коллекцию пар без дубликатов, независимо от порядка слов.

0
ArrayList<String> ar=new ArrayList<String>(); 
String a[]={"cat","bat","cat","knife"}; 
for(int i=0;i<a.length;i++){ 
    if(!ar.contains(a[i])){ 
     ar.add(a[i]); 
    } 
} 

Создайте список массивов и проверьте, содержит ли он строку, которую нужно вставить. Если он не содержит строку, вы можете добавить ее в список массивов. Таким образом, вы можете избежать дублирования записей в списке массивов.

Элементы в списке массива для приведенного выше кода будет

cat bat knife

Смежные вопросы