JAVA: предотвращение дублирования записей в ArrayList
Я пытаюсь предотвратить добавление повторяющихся записей в ArrayList, поскольку список заполняется во время чтения каждой строки файла. Каждая строка файла имеет формат "node1 node2" (разделитель табуляции). Дубликат здесь может быть "node1 node2"или" node2 node1". Вот мой код, чтобы попытаться выполнить эту операцию:
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.
}
поскольку я уже разделяю каждую строку, чтобы сделать хэш-набор каждого узла, я пытаюсь использовать это для проверки дубликаты. На данный момент я просто не могу понять синтаксис правильно. Как я могу проверить предыдущие записи ArrayList на наличие дубликатов и предотвратить их добавление, продолжая заполнять ArrayList? что не так с этим кодом в данный момент?
пожалуйста, задайте любые вопросы, если что-то неясно,
спасибо заранее!
6 ответов
использовать 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]
Если вы хотите сохранить порядок чтения строк, продолжайте использовать список, но для дубликатов вы можете использовать набор для определения, была ли строка (в двух ее формах, как вы описали) уже добавлена :
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);
}
}
для каждого добавления в ArrayList вам придется перебирать все предыдущие записи и проверять, существует ли запись дубликатов (вы можете использовать .contains()
), который является O(N).
лучше я бы предложил использовать набор.
во-первых, использовать равна для сравнения строк.
во-вторых, вы можете использовать Set, а не список
и, наконец, вы можете использовать содержит метод для проверки, если элемент уже существует.
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
похоже, что вы действительно хотите это 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(" ")));
}
это создает коллекцию пар без дубликатов независимо от порядка слов.