2

Comparable クラスを拡張し、昇順のカスタム ArrayList インターフェイスがあります。私が取り組んでいるクラスは、このインターフェースを実装しています。

私の問題は、add メソッドを編集して、要素を ArrayList に追加し、List の順序を維持し、重複がないことを確認する必要があることです。

これらすべてを別々の方法で行うのは簡単ですが、それは問題外です。メソッドが呼び出されたときに (重複していない限り) 要素が正しい位置に追加されるように、1 つのメソッドですべてを実行する必要があります。

その上で、メソッドを挿入するインデックスの位置を確認するには、Comparable クラスから継承した compareTo() メソッドを使用する必要があります。唯一の問題は、作業中のクラスに独自の compareTo() メソッドを実装する必要があることです。私はすべてを見てきましたが、この特定のクラスでそれを行う方法について混乱しています。

これまでの私のコードは次のとおりです。

    public void add(E item) throws IndexOutOfBoundsException {

        if (contains(item)) {
            throw new IllegalArgumentException("This is a duplicate!");
        }
        //here is where I need the implementation to add the item to the array, in order

    }

次に、私のcompareTo()メソッドは次のとおりです。

        public int compareTo(E item) {

        if () {
          return -1;
        } 
        else if () {
          return 1;
        } 
        else {
            return 0;

        }
      }
4

4 に答える 4

2

これを行う 1 つの方法は、最初に以下を確認することです。

myArrayList.contains(item)

そうでない場合は、配列を挿入して再ソートします。

myArrayList.add(item);
Collections.sort(myArrayList);

一般に、ソートされたセットを重複せずに維持したい場合は、 よりも優れたデータ構造があることに注意してくださいArrayList

于 2011-04-06T03:36:58.277 に答える
0

TreeSetはどうですか?探している動作があるようです。

于 2011-04-06T03:29:38.777 に答える
0

正しい位置に要素を追加することは、二分探索に失敗し、比較した最後の位置を記録することと同じです。

Arrays.binarySearchのドキュメントを確認してください。うまくいけば、これはそれを実装するのに十分な情報を提供します. 比較可能な実装は、ソートに使用するものと同じでなければなりません。ドキュメントからの関連する抜粋は次のとおりです。

配列に含まれている場合は検索キーのインデックス。それ以外の場合は (-(挿入ポイント) - 1)。挿入ポイントは、キーが配列に挿入されるポイントとして定義されます。キーより大きい最初の要素のインデックス、または配列内のすべての要素が指定されたキーより小さい場合は a.length です。これにより、キーが見つかった場合にのみ、戻り値が >= 0 になることが保証されることに注意してください。

于 2011-04-06T08:15:12.150 に答える
0

そんなに多くの情報を与えません。実際に実装しているのは ArrayList のようなデータ構造である場合、最初に配列が新しい項目を追加するのに十分な大きさかどうかを確認する必要があります。そうでない場合は、新しいアレイを作成する必要があります。最初のケースでは、新しい要素を入力する場所を見つけ、その位置からすべてを 1 つ下に移動してから、要素を追加する必要があります。2 番目のケースでは、古いリストを新しい要素と「マージ」できます (つまり、新しい要素が移動する場所が現れるまで古いリストから追加し続け、新しい要素を追加して続行します)。私が持っている別の質問: compareTo(Object o) はどこに置かれていますか? ArrayList クラスに入れている場合、実際には配列を比較したくないので、それはかなり無意味です。ArrayListに格納されているクラスにある場合、このオブジェクトは渡されたオブジェクトの前にあり、このオブジェクトが後にある場合は -1、等しい場合は 0 です。データ構造を選択できる場合は、リンクされたリストを検討することをお勧めします。リンクされたリストは、追加および削除が非常に簡単です。

ArrayList クラスを拡張している場合、これは非常に (しゃれが意図された) 簡単です。add メソッドでは、要素を追加する場所を決定し、次に super.add(int loc) メソッドを呼び出す必要があります

于 2011-04-06T04:57:12.467 に答える