3

配列内のオブジェクトがどのスロットにあるかを検出する方法はありますか? オブジェクト配列がある場合、配列内のオブジェクトは、明示的に言われなくても、それがどのセルにあるかを検出できますか?

4

4 に答える 4

2

いいえ、残念ながら、Javaで配列がどのように機能するかというと、配列は単にオブジェクトを「指している」ということです。Java配列は(オブジェクトへの)参照のみを格納しますが、任意の数の変数が同じオブジェクトを参照できるため、オブジェクトは配列内のどこにあるかわかりません。実際、配列内の複数のインデックスから同じオブジェクトを指すことができます。

検討

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この情報を含むフィールドが必要です。1 つのオブジェクトに基づいて元の配列を変更しようとしている場合、たとえば、次のようなことが起こっている場合など、どこかに適切に分解されていないクラスがある可能性があります。

class A {
    Object data[];
}

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

次に、実際B.removeにはのメソッドである必要があり、したがって最初にAアクセスできる必要があります。dataなどなど。

さらに、配列は正しいデータ構造ではない場合があります。インデックスが多くのセマンティック値を持っている場合は、Map<Integer, Object>より適切な場合がありますが、インデックスが連続し1..nていて配列が不変である場合、これを表すために配列がよく使用されます。を使ったばかげた例ではremove、 a のList方が適切です。等。

于 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 に答える