【发布时间】:2017-08-20 00:47:56
【问题描述】:
假设我有一个类的两个实例:
public class MyClass {
public void sayHello() {
System.out.println("Hello");
}
}
a = new MyClass();
b = new MyClass();
现在我将它们添加到另一个对象中,例如:
public class OtherClass {
private ArrayList<MyClass> myClsList = new ArrayList<>();
public void add(MyClass obj) {
myClsList.add(obj);
}
public void remove(MyClass obj) {
// ????
}
}
c = new OtherClass();
c.add(a);
c.add(b);
现在我想删除一个特定的实例,例如
c.remove(a);
我可以遍历它们并测试是否相等吗?我的意思是理论上这应该可行,因为这两个实例具有不同的“内部指针”?
我想使用基于 HashMap 的方法会更有效,但我可以在那里使用什么作为键(假设我不能添加唯一的实例 ID 或其他东西)。
编辑:对于我到底想知道什么有些困惑。 这里的关键是我想知道是否有任何方法可以从 c 的 ArrayList 或我可能使用的任何聚合器对象中删除该特定实例,只需提供相应的对象引用即可。 我想这可以通过只保留 ArrayList 并测试是否相等来完成(尽管我不是 100% 确定),但如果可以不遍历整个列表,它会更干净。 我只是想知道在 Java 中是否有类似的东西。 (我知道如何通过使用附加信息来解决它,但线索是仅使用相应的对象引用来进行过滤/检索。
【问题讨论】:
-
您可以为您的类使用唯一标识符(例如,键入 int),并将该标识符用作您的哈希条目。
-
您是否有任何具体原因要查找未索引的附录?我所看到的只是你附加了一个,但我看不出有什么理由不能扩展这个特定的类。请记住,Java 是 一种解释型语言,而在实践中你可以这样做,你并没有给我们一个很好的例子。
-
对于2.可以使用
HashSet,如果需要保持插入LinkedHashSet的顺序。 PS:现在需要hashcode()。 -
@Gio 我知道,但这就是我不想要的,正如问题中所述。
-
使用 Object.equals 有什么问题?这基本上是为您实现唯一的 id 平等。