1

これは私の宿題の一部です。

以下のストランドソートの疑似コードが与えられました。

    define strandSort( L )
      result = []
      while len(L) > 0
        inorder = []
        remove first element of L, add it to inorder
        for each item i in L:
          if i >= last item in inorder
            remove i from L, add it to inorder
        result = merge(inorder,result)
      return result

次のようにプログラムにコードを実装しました。

public List<Integer> strandSort(List<Integer> nums) {
    List<Integer> result = new ArrayList<Integer>();
    while(nums.size() > 0){
        List<Integer> inorder = new ArrayList<Integer>();
        int toAdd = nums.remove(0);
        inorder.add(toAdd);
        for(Integer i : nums){
            if (i >= inorder.get(0) ){
                toAdd = nums.remove((int)i);
                inorder.add(toAdd);
            }
        }
        result = merge(inorder, result);
    }
    return result;

ただし、「 for(Integer i : nums) 」行で範囲外エラーが発生します。なぜこれが起こっているのかがわかると思います。リストから要素を削除しながら、リストを反復処理しようとしています。

よくわからないのは、それを修正する方法です。疑似コードを正しく実装していれば、このようなエラーが発生することはないと思います。したがって、私はそれを正しく実装していないと考えています。

もしそうなら、入力リストを破壊せずに StrandSort コードを作り直す最良の方法は何ですか?

(二重投稿で申し訳ありません。説明が終わる前に誤って質問を送信してしまいました!)

4

2 に答える 2

0

toAdd = nums.remove((int)i);あなたの犯人です。

JavaDocから:

E remove(int index) このリスト内の指定された位置にある要素を削除します (オプションの操作)。

boolean remove(Object o) 指定された要素が存在する場合、このリストから最初に出現する要素を削除します (オプションの操作)。

Integeranを anにキャストしていてint、 の最初のバージョンremove()が呼び出されるため、混乱します。これにより、コードはそれ自体ではなくat 要素を削除します。明示的なキャストを削除してみてください。ii(int)

于 2013-10-08T22:06:05.747 に答える
0
if (i >= inorder.get(0) ){

と同じではありません

if i >= last item in inorder

最初のケースでは、最後のものではなく、最初のものを取得しています。

于 2013-10-08T22:06:16.587 に答える