4

わかりました。getSharedPreferencesを使用してハイスコアを保存していますが、入力する前に、配列を介してスコアを昇順で並べ替えたいと思っていましたが、最初の位置でスコアよりも小さいスコアが見つかった場合、残りのスコアはチェックされません。一番小さい?

    //function to add score to array and sort it
    public void addscoretoarray(int mScore){
    for(int pos = 0; pos< score.length; pos++){
        if(score[pos]  > mScore){
            //do nothing
        }else {
                //Add the score into that  position
                score[pos] = mScore;
                break;
            }
    }
    sortArray(score);
}

この問題を修正するには、ループの前後にsortArray()を呼び出す必要がありますか、それとも同じ結果を達成するためのより良い方法がありますか?

また、sortArray(score)関数はArrays.sort(score)を呼び出しているだけであり、scoreはmScoreの配列です。

編集:@Vincent Ramdhanieが投稿した内容に基づいて、投稿を修正しました:

    public void addscoretoarray(int mScore){
    int pos = score.length; 
    //sort the array (in ascending order)
    sortArray(score);

    //go though the array( in descending order) and check for a place that suits the conditions
    while(pos>=0 && score[pos] > mScore){ 
         pos--; //do nothing as score[pos] is larger than mScore
    }
     //so once a pos is found (e.g. broke out of the while loop)
     //check that it is still in the list
    if(pos >= 0){
        //if it is then move everything down 1 position
        for(int i = 0; i < pos; i++){
            score[i] = score[i+1];
        }
        //replace the initial pos with the new score
        score[pos] = mScore;
    }
}

for(int i = 0; i < pos; i++){私はまだそれがループにあるときにリストから外れると信じています。

4

4 に答える 4

5

私があなたを正しく理解したなら、私はこれを提案します

    int[] a1 = { 1, 2, 3, 4, 6 };
    int mScore = 5;

    int[] a2 = new int[a1.length + 1];
    Arrays.sort(a1);
    int p = Arrays.binarySearch(a1, mScore);
    if (p < 0) {
        p = -p - 1;
        System.arraycopy(a1, 0, a2, 0, p);
        System.arraycopy(a1, p, a2, p + 1, a1.length - p);
        a2[p] = mScore;
    }
    System.out.println(Arrays.toString(a2));

出力

[1, 2, 3, 4, 5, 6]

一意の値のみが挿入されることに注意してください

于 2012-12-08T13:32:26.007 に答える
3

スコアの配列をソートしたままにしてみませんか。したがって、配列にスコアを追加すると、配列は常に降順で並べ替えられると想定されます。挿入される新しいスコアは、挿入時に配列から最も低いスコアをプッシュするだけです。次に、次のような挿入アルゴリズムを使用できます。

   insertScore(int[] scores, int mscore){
        //find insert point
        int i = 0;
        while(i < scores.length && scores[i] > mscore){
            i++;
        }
        if(i < scores.length){
            //you found a place to insert the score
            for(int j = scores.length-1; j > i; j--){
                scores[j] = scores[j - 1];
            }
            scores[i] = mscore;
        }
   }

この場合、アレイを再利用する必要はありません。

于 2012-12-08T10:41:59.797 に答える
2

binarySearchの@returnへのjavadocを参照してください。

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

于 2015-10-06T20:34:56.310 に答える
0
public void addscoretoarray(int mScore){
    for(int pos = 0; pos< score.length; pos++){
        if(score[pos]  > mScore){
            //do nothing
        }else {
                //Add the score into that  position
                score[pos] = mScore;
                break;
            }
    }
    sortArray(score);
}

コードにはいくつかの大きなバグがあります。

  1. score[pos] = mScore; このステートメントでは、保存された値が失われる結果となるmScore位置に割り当てています。pospos

  2. 配列を使用している場合、その間に要素を格納するには、残りのすべての要素を1つ右に移動する必要がありますが、ここでは実行していません。

  3. score[pos] = mScore; break;

ブレークは、要素をposに格納した後、最初の反復自体でループをブレークします。

提案 :

ネイティブ配列の代わりにarraylistを使用します。変更された擬似コード:

public void addscoretoarray(int mScore){
    int index = getFirstIndexOfScoreGreaterThanmScore(); // need to implement it
    if(index == -1){ // no element greater than mscore
    score.add(mScore);
    }else{
    score.add(index,mScore);
}
//   sortArray(score); // no need to call this if the list is initially empty as the insertion will be in sorted order itself
if(score.length == maxSize){
//do whateverwhen the list is full as per your requirements
}
}
于 2012-12-08T11:01:13.947 に答える