Если у вас есть по крайней мере 4 дубликаты в List
, первый цикл будет найти 3, то второй цикл будет найти 2, третий цикл будет найти 1, что дает результат 6. В принципе, каждый цикл снова находит одни и те же дубликаты.
Например ...
public static void main(String[] args) {
ArrayList<String> houses = new ArrayList<>(25);
houses.add("(1x1)");
houses.add("(1x2)");
houses.add("(1x1)");
houses.add("(1x3)");
houses.add("(1x1)");
houses.add("(1x4)");
houses.add("(1x1)");
houses.add("(1x5)");
System.out.println(houses.size());
System.out.println(duplicateHouses2(houses));
}
public static int duplicateHouses(ArrayList<String> houses) {
int duplicateCount = 0;
for (int i = 0; i < houses.size(); i++) {
System.out.println("---");
for (int j = i + 1; j < houses.size(); j++) {
if ((houses.get(i)).equals(houses.get(j))) {
System.out.println(i + ": " + houses.get(i) + " == " + j + ": " + houses.get(j));
duplicateCount++;
}
}
}
return duplicateCount;
}
Какие выходы ...
---
0: (1x1) == 2: (1x1)
0: (1x1) == 4: (1x1)
0: (1x1) == 6: (1x1)
---
---
2: (1x1) == 4: (1x1)
2: (1x1) == 6: (1x1)
---
---
4: (1x1) == 6: (1x1)
---
---
---
Теперь вы можете, создать копию List
и удалить каждый дубликат, как вы найдете его, или вы могли бы используйте второй номер List
для хранения повторяющихся значений.
Я попытался вычисления разности между Set
значений и исходного List
, но это возвращается значение, которое было 1 меньше ожидаемого результата (в приведенном выше примере это возвращенного 3 вместо 4)
Вместо этого, Я использовал Stream#filter
оригинала и Set
для создания дубликата счета
Например ...
public static int duplicateHouses(ArrayList<String> houses) {
// Make sure we only have 1 of each possible value
Set<String> copy = new HashSet<>(houses);
int duplicateCount = 0;
// For each value, we want to filter the original
// list so that only matching values remain...
for (String value : copy) {
Stream<String> filter = houses.stream().filter((String t) -> t.equals(value));
// If there is more then one, then there are duplicates...
long count = filter.count();
if (count > 1) {
duplicateCount += count;
}
}
return duplicateCount;
}
что, учитывая первый экс ample, возвращает 3
@MadProgrammer, но 'j' всегда начинается с' i + 1' – KOB
Код выглядит отлично. Не могли бы вы вставить минимальные тестовые данные, демонстрирующие ошибку? –
@CornOnTheKob Мой плохой, пропустил это – MadProgrammer