【问题标题】:How to check if a variable is referencing an element in "this" collection?如何检查变量是否引用“this”集合中的元素?
【发布时间】:2018-04-16 18:43:14
【问题描述】:

假设您有一个创建数字列表的类。您可以在任何位置添加数字或删除数字。如果我创建该类的两个实例 listAlistB 我可以对这两个类执行相同的操作。但是,如果我执行以下操作:

List<Integer> listA = new PositionList<>();
Position<Integer> a = listA.add(1);
Position<Integer> b = listA.add(7);
List<Integer> listB = new PositionList<>();
b = listB.add(7);

listA.remove(b)

我不会从 listA 中删除 b,因为该变量现在指向 listB 实例。我正在编写一个方法,该方法应该确保正在操作的任何变量都指向我指定的实例。对于listA.remove(b),我会确保b 指向我添加到listA 中的7。有没有办法检查这个?我知道解决方法是一开始就不要这样做,但是如果我无法进行这些更改,我需要弄清楚如何去做。

【问题讨论】:

  • 看来PositionList&lt;&gt; 实现了List&lt;Integer&gt;,在这种情况下listA.add(1) 应该返回boolean,而不是Position&lt;Integer&gt;。你有一个不同的界面,对吧?
  • 老实说,我已经多次阅读您的问题,但我无法理解您在问什么。
  • @lexicore 抱歉,我对此有点陌生,很难准确地表达我的意思。我想知道的是如何测试listA or listB 这两个列表中的哪一个是b 指向的变量。我知道它指向 listB,但我想用代码测试它。 isInstance()getClass() 之类的东西,如果存在的话。
  • @Alex 请解释一下“指向”的确切含义。
  • @lexicore 我的意思是b = listA.add(7); 引用了我添加到listA 中的整数7。在b = listB.add(7); 之后,它现在引用添加到listB 的整数7。我写了listA.remove(b) 来说明如果我尝试从listA 中删除b,它实际上会将它从listB 中删除,因为那是b 现在“指向”的地方

标签: java pointers collections


【解决方案1】:

一种方法是添加对您返回的Position&lt;T&gt; 的列表引用,并在remove 方法中检查它:

class Position<T> {
    private final T v;
    private final int p;
    final PositionList<T> owner;
    public T getValue() { return v; }
    public int getPosition() { return p; }
    Position(T val, int pos, PositionList<T> o) {
        v = val;
        p = pos;
        owner = o;
    }
}

class PositionList<T> {
    ...
    public void remove(Position<T> p) {
        if (p.owner != this) {
             ... // Error! Throw an exception or exit
        }
        ...
    }
}

【讨论】:

    猜你喜欢
    • 2023-03-12
    • 2021-05-05
    • 2010-11-23
    • 1970-01-01
    • 2016-10-19
    • 2021-12-22
    • 2018-10-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多