4

boolean java.util.List.remove(Object object)メソッドが false を返すのはいつ、なぜですか?

ドキュメントの状態

[メソッドの戻り値] この List がこの操作によって変更された場合は true、そうでない場合は false。

リストで操作が有効にならないのはなぜですか?

(注:私が利用しているリストの実装はですArrayList

更新: 削除しようとしているオブジェクトはリストに存在します。Listクラスを(したがって引数this)に追加し、 (this同じクラス内で) remove メソッドに渡します。そのため、オブジェクトはリストに存在する必要があります (または存在しませんか?)。

更新: これがコードです。メソッドをご覧くださいdelay()。からそれぞれのクラスを削除しようとする場所がありListます。

public class Timer extends Object {

    private static List<Timer> allTimers;
    private Long startTime;
    private int delayTime;
    private boolean registered;

    String name;

    public Timer(String name) {
        this.name = name;
        this.registered = true;
        allTimers.add(this);
        Log.d("SpaceDroid", "Foo: Created timer: " + name + " Size: " + this.allTimers.size());

    }

    public Timer(String name, int delayTime) {
        this(name);
        this.delayTime = delayTime;

    }

    public void setDelayTime(int delayTime) {
        this.delayTime = delayTime;

    }

    public boolean delay() {
        if(this.startTime == null) {
            this.startTime = System.currentTimeMillis();
        }

        if(startTime + this.delayTime < System.currentTimeMillis()) {
            if(this.registered) {
                Log.d("SpaceDroid", "Foo: Trying to remove timer: " + name);
                if(this.allTimers.remove(this)) {
                    Log.d("SpaceDroid", "Foo: Successfully removed timer: " + name);
                }
                else {
                    Log.d("SpaceDroid", "Foo: Did not remove timer: " + name);
                }

            }
            return true;

        }
        else {
            return false;

        }

    }

    // The same as resume, just renew the startTime

    public void reset() {
        this.startTime = null;
        this.registered = true;
        this.allTimers.add(this);

    }

    public void resume() {
        this.startTime = System.currentTimeMillis();

    }

    public void pause() {
        // Check if timer is still running
        if(!this.delay()) {
            // Calculate new delayTime
            delayTime = (int) ((startTime + this.delayTime) - System.currentTimeMillis());
            Log.d("SpaceDroid", "Foo: New delay time: " + delayTime + " for timer: " + name);

        }


    }

    public static void resumeAllTimers() {
        List<Timer> timers = new ArrayList<Timer>(Timer.allTimers);
        for (Timer timer : timers) {
            timer.resume();
        }

    }

    public static void pauseAllTimers() {
        List<Timer> timers = new ArrayList<Timer>(Timer.allTimers);
        for (Timer timer : timers) {
            timer.pause();
        }

    }

    public static void disposeAllTimers() {
        Timer.allTimers.clear();
        Timer.allTimers = null;

    }

    public static void initializeAllTimers() {
        allTimers = new ArrayList<Timer>();

    }


}
4

3 に答える 3

10

渡されたものが実際にリストにない場合Object、リストに影響を与えないため、false が返されます。

編集(ジェイに感謝):メソッドは、特定Objectの sequals()メソッドを使用して、そのオブジェクトが含まれているかどうかを判断します。そのため、カスタム オブジェクトがある場合は、必ずメソッドをオーバーライドし、 (メソッド間の一般的な契約を維持するために)equals()もオーバーライドしてください。hashCode()

于 2013-04-20T12:33:06.357 に答える
2

List はインターフェースであるため、具体的な例の実装はありません。ただし、ArrayList から取得すると、次の場合にfalseが返されます。

  • null を渡し、リストに null オブジェクトがない、または
  • リストにないオブジェクトを渡します

ArrayList.java から

     public boolean remove(Object o) {
         if (o == null) {
             for (int index = 0; index < size; index++)
                 if (elementData[index] == null) {
                     fastRemove(index);
                     return true;
                 }
         } else {
             for (int index = 0; index < size; index++)
                 if (o.equals(elementData[index])) {
                     fastRemove(index);
                     return true;
                 }
         }
         return false;
     }

完全を期すために、fastRemove のコードを追加します。

 private void fastRemove(int index) {
      modCount++;
      int numMoved = size - index - 1;
      if (numMoved > 0)
          System.arraycopy(elementData, index+1, elementData, index,
                           numMoved);
      elementData[--size] = null; // Let gc do its work
  }

それを証明する:

public static void main(String[] args) {
        ArrayList l = new ArrayList();
        System.out.println("Removing null on empty list: " + l.remove(null));
        System.out.println("Removing an object that won't be found: " + l.remove(new Object()));
}

結果:

Removing null on empty list: false
Removing an object that won't be found: false
于 2013-04-20T12:44:27.577 に答える
1

このドキュメントから

指定された要素が存在する場合、このリストから最初に出現する要素を削除します (オプションの操作)。このリストに要素が含まれていない場合、要素は変更されません。より正式には、 (o==null ? get(i)==null : o.equals(get(i))) (そのような要素が存在する場合) となる最小のインデックス i を持つ要素を削除します。このリストに指定された要素が含まれていた場合 (または、呼び出しの結果としてこのリストが変更された場合) は true を返します。

于 2013-04-20T12:33:58.447 に答える