2017-07-18 4 views
2

楽しいので、私はCheckiOでJavaScriptをいくつか開始しました。中央値のタスクで私は問題を持っています。最初に、forループで指定された配列をソートしようとしました。ループ中に配列を見るために、私はconsole.logを使用しました。forループによる配列の並べ替えが失敗しました

for (var i = 0; i < data.length-1; i++) { 
    if (data[i] > data[i+1]) { 
     var temp = data[i]; 
     data[i] = data[i+1]; 
     data[i+1] = temp; 
     i = 0; 
    } 
    console.log(data); 
} 

間違った位置に番号が1つしかない場合は問題です。並べ替えが停止し、配列を数回印刷するだけです。 例:

median([5,4,3,2,1]) 
[ 4, 5, 3, 2, 1 ] 
[ 4, 3, 5, 2, 1 ] 
[ 4, 3, 5, 2, 1 ] 
[ 4, 3, 2, 5, 1 ] 
[ 4, 2, 3, 5, 1 ] 
[ 4, 2, 3, 5, 1 ] 
[ 4, 2, 3, 5, 1 ] 
[ 4, 2, 3, 1, 5 ] 
[ 4, 2, 3, 1, 5 ] 
[ 4, 2, 1, 3, 5 ] 
[ 4, 1, 2, 3, 5 ] 
[ 4, 1, 2, 3, 5 ] 
[ 4, 1, 2, 3, 5 ] 
[ 4, 1, 2, 3, 5 ] 

この動作の説明はありますか?ありがとう!

+0

https://developer.mozillaをご覧ください。org/ja-ja/docs/Web/JavaScript/Reference/Global_Objects /配列/ソート – ericwenn

+0

ソートを手作業で行う必要がありますか、 'data.sort();'を使用して処理することができますか? – James

+0

私はあなたの理解とあなたのコードと私の違いを確認できるように私の答えのビットを改訂しました。私はソートループのこの考え方はシンプルでいいですが、フィニッシュラインに到達するにはデバッグの助けが必要でした。私の答えは単に解決策ではなく、あなたが自分のミスをコンソールでどのように見て、デバッグがうまくいくかを自分で理解する方法でもあります。 –

答えて

1

JavaScripts Arrayプロトタイプオブジェクトには、優れたソート機能が実装されています。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort

しかし、私はあなたがこれを知っている賭けていると学習目的のために、このコードを実装しています。私たちは、反復の必要数を知らないので、それはより適切かつ明確だ

var i = 0; 
while(i < data.length) { 
    if(data[i] > data[i + 1]) { 
    var temp = data[i]; 
    data[i] = data[i + 1]; 
    data[i + 1] = temp; 
    i = 0; 
    continue; 
    } 

    i += 1; 
} 

:あなたのバージョンで

バグはこれを試して、代わりにこの変数i

のインクリメントに関し、 forループの代わりにwhileループを使用してください。この方法では、コードは明確で、iのインクリメントは、論理ifステートメントがfalseと評価された場合にのみ行われます。

+0

私はこのソリューションで何をしたのが好きです。私のバージョンでは、i = -1と設定しましたが、実際にはそれがかなりうまく処理されています。複数のユーザーが作業しているコードがあると、誰かがあなたの作業を壊さないようにコメントを書く必要はありません。うまくいった。 –

+0

ありがとうKenneth! –

0

ifブロック内でi=0を作成しても、繰り返し処理が終了するとiは増分されて1になるため、データ[0]を再度確認することはないため、コードが失敗します。

var data = [5,4,3,2,1]; 
 

 
for(var i = 0; i < data.length;) { 
 
    if(data[i]>data[i+1]) { 
 
     var temp = data[i]; 
 
     data[i] = data[i+1]; 
 
     data[i+1] = temp; 
 
     i = 0; 
 
    }else{ 
 
     i++; 
 
    } 
 
    console.log(data); 
 
}

0

あなたが書いたコードは、それが原因のiの値に1を加算したループ反復に最初の要素をチェックしないことを除いて正常に見える: あなたはこのような何かを行うことができます。

これを修正するには、i = 0;の代わりにi = -1;を設定してください。

median([5,4,3,2,1]); 
 

 
function median(data) { 
 
    for(var i = 0; i < data.length-1; i++) { 
 
    \t \t //console.log(i, data[i], data[i+1], data); 
 
     if(data[i]>data[i+1]) { 
 
      var temp = data[i]; 
 
      data[i] = data[i+1]; 
 
      data[i+1] = temp; 
 
      i=-1; // Reset iterator so it is back to 0 on the next loop. 
 
     } 
 
     console.log(data); 
 
    } 
 
}

編集:私は、スニペットにコードのコメントアウト行を追加しました。それをコメント解除して他のconsole.logにコメントすると、現在のインデックス、そのインデックスの値、それを比較しているインデックスの値、そして現在のインデックスの値を示すコンソールへの出力が得られます配列の状態。 -1を0に変更して、-1にリセットされている点と異なる点を確認してください。

0

var a =[ 4, 5, 3, 2, 1 ]; 
 
var b =[ 4, 3, 5, 1, 2 ]; 
 
var c =[ 5, 3, 4, 2, 1 ]; 
 

 

 
function mySort(inArray) { 
 
    return inArray.sort(function(x,y) { return x>y ? 1 : -1}); 
 
} 
 

 
console.log(mySort(a)); 
 
console.log(mySort(b)); 
 
console.log(mySort(c));

これは、あなたが探しているものでしょうか?

関連する問題