Так что я искал эту «проблему» и только натолкнулся на вопросы, спрашивающие, как удалить реальные дубликаты из списка. Но я хочу удалить каждый объект, равный другому объекту в списке, в соответствии с пользовательским методом .equals ().
Здесь у меня есть пример класса с equals () переопределяемый метод:
private static class Test {
int x;
float[] data;
public Test(int x, float[] data) {
this.x = x;
this.data = data;
}
@Override
public boolean equals(Object obj) {
if (obj instanceof Test) {
Test compare = (Test) obj;
if (
compare.x == this.x &&
Arrays.equals(compare.data, this.data)
) {
return true;
}
}
return false;
}
}
Теперь, конечно, следующее не будет тем же (без дубликатов, которые могут быть удалены, например, с помощью HashMap):
Test test1 = new Test(3, new float[]{0.1f, 0.4f});
Test test2 = new Test(3, new float[]{0.1f, 0.4f});
Но в моем случае они дубликаты, и я хочу оставить только один из них.
Я пришел с таким подходом:
Test test1 = new Test(3, new float[]{0.1f, 0.4f});
Test test2 = new Test(3, new float[]{0.1f, 0.4f});
Test test3 = new Test(2, new float[]{0.1f, 0.5f});
List<Test> list = new ArrayList<>();
list.add(test1);
list.add(test2);
list.add(test3);
Set<Test> noDuplicates = new HashSet<>();
for (Test testLoop : list) {
boolean alreadyIn = false;
for (Test testCheck : noDuplicates) {
if (testLoop.equals(testCheck)) {
alreadyIn = true;
break;
}
}
if (!alreadyIn) {
noDuplicates.add(testLoop);
}
}
И это прекрасно работает, но не так хорошо с точки зрения производительности. (В моем случае это важно, потому что размер списка может быть большим)
Теперь мой вопрос: Есть ли более удобный подход для достижения этого?