3

順序付けられた ArrayList に任意の数値を挿入する方法について興味深い問題があります。ユーザーが入力するとしましょう[12,34,37,60,89]; このメソッドaddListElement()は配列をトラバースして、新しい要素が移動するインデックスを見つける必要があります。

ユーザーが数値 50 を入力すると、新しい配列は になります[12,34,37,50,60,89]。for ループを使用して ArrayList をトラバースしましたが、if() ステートメントについてよくわかりません。

public void addListElement() {
    System.out.println("Add number to arrayList");
    Scanner scan = new Scanner(System.in);
    int number = scan.nextInt();

    int loc = 0;
    for (int i = 0; i < aryList.size(); i++) {
        if (number > 0 && i < loc) {
            loc++;
        }
    }

    aryList.add(loc, number);
    System.out.println(aryList.toString());
}
4

6 に答える 6

5

これを試して:

int position = Collections.binarySearch(aryList, number);
aryList.add(position < 0 ? -position - 1 : position, number);

番号が既に存在する場合、古いコードがクラッシュすることを指摘してくれてありがとう

于 2012-10-14T21:40:13.290 に答える
2

List<E>.add(int idx, E element)あなたはその方法を利用したいと思うでしょう。要素を順番に挿入する背後にある考え方は、ある配列a、要素a i、およびある整数nの場合:

a i <= n <= a i + 1、0 <i <len(a)-1。

// edge case:  Size one list, number coming in is smaller.
if(aryList.size() == 1 && aryList.get(0) >= number) {
    aryList.add(0, number);
} else {
    for(int i = 0; i < aryList.size()-1; i++) {
        if(number >= aryList.get(i) && number <= aryList.get(i+1)) {
            aryList.add(i, number);
        }
    }
    // number is the largest seen; add it to the end.
    aryList.add(number);
}
于 2012-10-14T21:50:13.363 に答える
1

これもうまくいくはずです。リストはすでに昇順になっているため、リスト内の数値が現在の数値よりも大きい場合は、arrayList のこの数値の前に新しい 1 番目のインデックスを挿入します。

 for (int i = 0; i < aryList.size(); i++) {
    if (aryList.get(i)>number) {
       break;
    }
  loc++;
}
于 2012-10-14T22:01:56.157 に答える
0

より多くの要素があり、その数が現在の要素よりも少ない限り、インデックスをインクリメントします。また、ユーザーが現在リストにあるどの番号よりも大きい番号を指定した場合は、終了時にi!= list.size()を確認する必要があります。

while (number >= 0 && number <= list.get(i) && i < list.size()) {
    i++;
}

list.add(i, number);
于 2012-10-14T21:49:50.130 に答える
0

あなたの要素は昇順で並べられていると思います

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

ArrayListに重複を挿入する場合は、コード行を削除するだけです。

if (arrayList.get(i) == x) return;
于 2012-10-14T22:19:23.583 に答える
0
int loc = 0;
int prevNumber = aryList.get(0);
for(int i = 1; i<aryList.size(); i++){
            if(number > prevNumber && number <= aryList.get(i)){ 
               return i;
            }
    prevNumber = aryList.get(i);
  }
于 2012-10-14T21:44:52.400 に答える