3

有没有办法让数组中的对象检测它们所在的插槽?如果我有一个对象数组,数组中的对象是否可以在没有明确告知的情况下检测到它所在的单元格?

4

4 回答 4

2

不,不幸的是,数组在 Java 中的工作方式是数组只是“指向”一个对象。由于 Java 数组只存储引用(对对象),但任意数量的变量都可以引用同一个对象,因此 Object 不知道它在数组中的位置。实际上,可以从数组中的多个索引指向同一个对象!

考虑

Object o = new Object(); // The variable o has a "reference" to the Object in memory
Object[] arr = new Object[3]; // empty array to hold Object types
arr[0] = o; // the first index points to the Object we created above
arr[1] = o; // the second index points to that same object!
arr[2] = o; // still the same object! If we modified the original object (assuming it's not immutable) in any way, all the indices in this array would point to the modified object.

希望这可以帮助!

迭代对象数组的最快(最容易编写)方法是

for (Object o : arr) {
    // do something to the local variable o, which you can think of as representing each object in your array
}
于 2013-03-24T02:23:34.713 回答
2

不,如果您需要这样做,您可能存在设计缺陷。为什么Object需要知道它出现在数组中的什么位置?如果索引对对象具有某种语义意义或感兴趣,那么对象应该有一个int包含该信息的字段。如果您尝试基于一个对象修改原始数组,那么您可能在某处有一个分解不良的类,例如,如果发生这样的事情:

class A {
    Object data[];
}

class B {
    remove(A a, Object instance) {
        // how to remove instance from a.data??
    }
}

那么真的B.remove应该是一种方法,A因此首先可以访问data。等等。

此外,数组可能不是正确的数据结构。如果索引具有很多语义值,则 aMap<Integer, Object>可能更合适,尽管当索引连续1..n且数组不可变时,通常使用数组来表示这一点。在我的愚蠢示例中remove, aList会更合适。等等。

于 2013-03-24T02:41:45.450 回答
1

尝试

    int i = Arrays.asList(arr).indexOf(obj);
于 2013-03-24T02:49:37.667 回答
0

正如@Aaron_H 所说,没有骰子。我会补充一点,您可以使用以下方法解决它:

public class Test {

    public static void main(String[] args) {
        ZenArray<IndexedString> z = new ZenArray(10);
        for (int i = 0; i < z.size(); i++) {
            z.set(i, new IndexedString("String " + i));
        }
        for (int i = 0; i < z.size(); i++) {
            System.out.println("I'm at index " + z.get(i).getIndex());
        }
    }
}

class ZenArray<T extends ZenArray.IndexedElement> {

    private Object [] a;

    interface IndexedElement {
        void setIndex(int i);
        int getIndex();
    }

    public ZenArray(int size) {
        a = new Object[size];
    }

    public void set(int i, T val) {
        val.setIndex(i);
        a[i] = val;
    }

    public T get(int i) {
        return (T)a[i];
    }

    public int size() {
        return a.length;
    }
}

// An example of an indexed element implementation.
class IndexedString implements ZenArray.IndexedElement {

    int i;
    String val;

    public IndexedString(String val) {
        this.val = val;
    }

    public String getVal() {
        return val;
    }

    @Override
    public void setIndex(int i) {
        this.i = i;
    }

    @Override
    public int getIndex() {
        return i;
    }    
}
于 2013-03-24T03:07:59.150 回答