1

これは私が今持っているものです:

public ArrayList subList(int fromIndex, int toIndex){
      ArrayList a = new ArrayList();
      for (int i=fromIndex;i<toIndex;i++) {
          a.add(stuff[i]); //stuff is a array of strings
      }
    return list;
  }

しかし、新しい配列を作成せずにサブリストを返すことは可能ですか? Array/ArrayList クラスのメソッドの使用は制限されています。

4

5 に答える 5

2

Java subList メソッドと同じ動作が必要な場合は、元のリストへのポインターを保持し、オフセットと長さを使用して元のリストにインデックスを付ける必要があります。

get メソッドの実装を示します。

public class SubList extends AbstractList {
    private final List original;
    private final int from;
    private final int to;
    public SubList(List original, int from, int to) {
        this.original = original;
        this.from = from;
        this.to = to;
    }

    public Object get(int i) {
        if (i < 0 || i > to - from) {
            throw new IllegalArguementException();
        }

        return original.get(from + i);
    }
}

public static List subList(List original, int from, int to) {
    return new SubList(original, from, to);
}
于 2010-10-05T06:05:10.253 に答える
0

独自のバージョンの ArrayList ではなく、標準の ArrayList を返す必要があると思います。また、「もの」はリストではなく配列であると想定しています。

まず、ArrayList に配列の初期サイズ (toIndex - fromIndex) を持たせるためのボーナス ポイントを取得します。より多くのボーナス ポイントを得るには、to および from インデックスが実際に 'stuff' に存在することを確認してください。そうしないと、素晴らしいクラッシュが発生します。

ArrayList はそのストレージに内部配列を使用し、それを変更することはできないため、コピーを作成するしかありません。

編集 物事を興味深く、より複雑にすることもできますが、誰かに感銘を与えるでしょう... List を実装する独自の ArrayList クラスを作成してそれを行います。その元の配列を使用するように取得します。その配列が外部のどこかで変更された場合、問題が発生するため、かなり不安定ですが、楽しいかもしれません。

于 2010-10-05T05:54:34.193 に答える
0

ストレージ用の新しいリストを作成しないようにするには、元のリストへの参照を渡し、サブリストを保持し、残りのアイテムをリストから削除する必要がありますが、これにより、リストに他のアイテムが欠落したままになります。

それが目標でない場合は、サブリストを保持するために、ある時点で新しいリストを作成する必要があります。

于 2010-10-05T05:59:25.570 に答える
0

サブリストは「新しいリスト」なので、配列のサブリストを表す何かを作成する必要があります。これは、新しい配列またはリストのいずれかです。あなたは私に似合う ArrayList を選びました。あなたは新しい配列を(直接)作成していないので、実際にはあなたの質問のその点はわかりません。(たとえば、ArrayList を介して間接的に新しい配列を作成することを避けたい場合は、別のList実装を選択してくださいLinkedList)

わずかな改善を探している場合:

  • ソース配列をメソッド パラメーターとして渡すことを検討してください。現在stuff[]は静的フィールドです。
  • サブリストのサイズで新しい ArrayList を初期化することを検討してください ( toList-fromList+1)
  • ジェネリックの使用を検討してください (この概念を既に使用している場合のみ)。したがって、戻り値の型は次のようになりますArrayList<String>
于 2010-10-05T06:03:29.080 に答える
0

あなたが返すことができる3つの賢明なものがあります。配列、リスト、または反復子。再実装する必要があるという私の仮定subListが正しかった場合、新しい ArrayList を作成する方法はありません。

于 2010-10-05T06:02:30.447 に答える