web-dev-qa-db-ja.com

要素をArrayListに昇順で挿入し、重複する要素はありません

次の条件でArrayList<Interger>に新しい要素を挿入または追加する必要がある宿題があります。

  1. 要素は昇順でなければなりません。

  2. 重複なしArrayList<Integer>の要素

  3. 挿入メソッドはO(n)回実行されます。

これは、新しい要素を追加する前に重複要素をチェックするための私の挿入メソッドです。

    public void insert(int x){
            //effect: Check duplicate elements if not x to the elements;
                boolean found = false;
                if(super.size()!=0){
                    for(int i=0; i<super.size(); i++){
                        if(super.get(i)==x){
                            found = true;
                        }
                    }
                }
                if(found){ return; }
                else{ super.add(x);  }
        }

どうすればいいですか?ありがとうございました。

追加

これが私のクラス名InSetExtraです

public class IntSetExtra extends ArrayList<Integer> {


    private static final long serialVersionUID = 1L;

    public IntSetExtra(){
        super();
    }

    public void insert(int x){
        //effect: Check duplicate elements if not x to the elements;
            boolean found = false;
            if(super.size()!=0){
                for(int i=0; i<super.size(); i++){
                    if(super.get(i)==x){
                        found = true;
                    }
                }
            }
            if(found){ return; }
            else{ super.add(x);  }
    }

    public String toString(){
        //effect: return string of this.
        if(super.size()==0) return "[]";
        String s = "[" + super.get(0).toString();
        for(int i=1; i<super.size(); i++){
            s += ", " + super.get(i).toString();
        }
        return s += "]";
    }

}

そして、私は大きなサイズの要素を挿入する必要があります、例えば:

IntSetExtra a, b;

    a = new IntSetExtra();
    b = new IntSetExtra();

    for(int i=0; i<30000; i++){ a.insert(2*i); }
    for(int i=0; i<30000; i++){ a.insert(i); }

    System.out.println("a sub = "+a.toString().substring(0, 37));

私は何をすべきか?

ps。私のインストラクターはArrayListのみを使用する必要があります

12
Giffary

これが私がそれをする方法です:(コメントの説明)

public void insert(int x){
    // loop through all elements
    for (int i = 0; i < size(); i++) {
        // if the element you are looking at is smaller than x, 
        // go to the next element
        if (get(i) < x) continue;
        // if the element equals x, return, because we don't add duplicates
        if (get(i) == x) return;
        // otherwise, we have found the location to add x
        add(i, x);
        return;
    }
    // we looked through all of the elements, and they were all
    // smaller than x, so we add ax to the end of the list
    add(x);
}

投稿した現在のソリューションは、要素を昇順で保存しないという事実を除いて、ほとんど正しいように見えます。

9
jjnguy

これがO(n)の挿入メソッドです。

public void insert(int x) {
    int pos = Collections.binarySearch(this, x);
    if (pos < 0) {
        add(-pos-1, x);
    }
}
25
Maurice Perry

これは宿題なので、(明白な解決策としてArrayListを使用するのではなく)TreeSetを使用してロジックを手動で実装する必要があると思います。実装を完了するには、次のヒントで十分だと思います:-)

配列要素がすでに昇順である場合は、配列全体をループする必要はありません。新しい要素以上の最初の要素を検索するだけです。等しい場合、あなたは重複しています。大きい場合は、その前に新しい要素を挿入すれば完了です。既存の要素がすべて新しい要素よりも小さい場合は、最後に挿入します。

これにより、必要に応じてO(n)パフォーマンスが得られます。ただし、改善策として、 linear の代わりに binary search を使用することを検討してください。 。

3
Péter Török

TreeSetを使用してみませんか: http://download.Oracle.com/javase/1.4.2/docs/api/Java/util/TreeSet.html

これはHomeWorkの質問であり、ArrayListを使用する必要があるため、回答を変更します。

トラバースを線形に使用し、要素を比較する必要があります。それに応じてアクションを実行します。

  • 新しい要素が現在の要素と等しい場合は、何もせずに戻ります。
  • 新しい要素が現在の要素よりも大きい場合は、次の要素に移動します。
  • 新しい要素が現在の要素よりも小さい場合は、このインデックスに要素を追加して返します。
  • トラバース中にリストの終わりに達した場合は、新しい要素を追加して戻ります。 (これにより、リストの最後に要素が追加されます)

ここでは、すべての要素が上記のアルゴリズムを使用して追加されていると仮定します。したがって、ArrayListは常にソートされます:)。

ここにコードがあります:

public void insert(int x) {
    for (int i = 0; i < size(); i++) {
        if (x == get(i)) {
            // if new element is equal to current element do nothing and
            // return
            return;
        } else if (x > get(i)) {
            // if new element is greater than current element traverse to
            // next.
            continue;
        }
        // code reaches here if new element is smaller than current element
        // add element at this index and return.
        add(i, x);
        return;
    }
    // if end of list is reached while traversing then add new element and
    // return. (This will add element at the end of list)
    add(x);
}

お役に立てれば。

1
YoK

新しいデータ構造のクラスを作成します。

データ値が追加されるたびに、配列リストでバイナリ検索を実行して、データ値がまだ存在していないことを確認します。すでに存在する場合は、例外を発生させます。存在しない場合は、ソートされた位置に挿入します。

この機能を実行する既存のデータ構造(TreeSet)があることを宿題に書き留めますが、これは、作成したばかりの実装よりも優れた実装を介して行われます。

1
babbitt

重複しない要素をセットに追加したい場合は、TreeSetを使用します。試してみます!

0
DaJackal