2016-09-10 15 views
2

私の教授は、ソートされたint配列を作成し、それを文字列を含むソート済み配列リストに変換するコードを与えました。これはメンテナンスに関する割り当てであり、元のコードを反映する必要があります。したがって、私は、サイズメソッド、Collections.sort()、または元のコードを反映しないものは使用できません。配列int配列を配列配列リストに変換する際の問題

我々はこれは私が配列リストに変換すると

 stringList() { 
    list = new ArrayList<String>(10); 
} 

    public void insert(String element) { 
    if(c == 0) { 
     list.add(0, element); 
     c++; 
    } else { 
     int j = 0; 
     for (int i = 0; i < c; i++, j++) { 
      if(element.compareTo(list.get(i)) == -1) 
       break; 
     } 
     for (int i = c; i > j; i--) { 
      list.set(i, list.get(0)); 
     } 

     list.set(j, element); 
     c++; 
    } 
} 

を出ていることが

list.set(i, list.get(0)); 

た場合に例外をスローし続けるものです

OrderedIntList() { 
    a = new int[10]; 
} 

    public void insert(int v) { 
    if(c == 0) { 
     a[0]= v; 
     c++; 
    } else { 
     int j = 0; 
     for (int i = 0; i < c; i++, j++) { 
      if(v < a[i]) 
       break; 
     } 
     for (int i = c; i > j; i--) { 
      a[i] = a[i - 1]; 
     } 

     a[j]= v; 
     c++; 
    } 
} 

を与えられていますデバッグ私は、ArrayList.classは、インデックスがサイズと等しいため、例外がスローされていることがわかります。私は解決策を考え出すことができない。どんな助けでも大歓迎です。あなたの問題へ

+3

短い答え:リストのサイズを増やすには、 'add'メソッドを使う必要があります。まだ挿入していない要素に対して 'set'を呼び出すだけではできません。 –

+1

@David Wallaceは、setがこれを許可したとしても、あなたの行list.set(i、list.get(0)); a [i] = a [i - 1]と同じではない、a [i] = a [0]のようなことをしている。だから、2つのバグがあります。 また、私はちょうどあなたが何を間違って解釈していると推測しています=新しいArrayList (10);この場合、10文字列のリストを作成しません。最初の容量(サイズではありません)を1 –

+0

に設定するためのヒントとして番号10を使用します。これはヒントではありません。それは実際のサイズです。 [javadoc](https://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html#ArrayList-int-)に従って:***指定された初期値を持つ空のリストを作成します容量*** – Bohemian

答えて

1

一つの解決策は、これだけが10個の文字列のリストを達成するため

stringList() { 
    list = new ArrayList<String>(10); 
    for(int i = 0; i < 10; i++){ 
     list.add(""); 
    } 
} 

行う代わりに

stringList() { 
    list = new ArrayList<String>(10); 
} 

であり、最初は単に保持する能力を持っているリストを作成します10文字列(パフォーマンスヒントのほうが多い)

+0

@Bohemian、データ構造に最初にデータを設定する必要はないという点であなたは正しいです。しかし、私が提案した変更は正しい。私はあなたがデータ構造をあらかじめ用意しておかないで、set()を使うのではなく、挿入時にリストの末尾に要素を追加する代替の方法を提案することを意味すると思います。これは挿入の並べ替えのために動作しますが、私が提案したものもうまくいくはずです。 –

3

この割り当ての興味深い点は、配列とリストの動作に大きな違いがあることです。配列の固定サイズはwhです項目が追加されるとileリストが展開されます。リストの場合、終わり以外の場所にアイテムを追加するのは挿入物で、自動的にアイテムを右に移動して余裕を持たせます。これは配列では起こりませんので、リファクタリングするコードで手作業で行う必要があります。

私の意見では、リストの配列の正確な最小限のリファクタリングはsetinsertに変え、要素をシフトするのに必要なコードを削除することです。もはやリストのために必要ではないです:空のリストに追加する

リストでは
public void insert(String element) { 
    if (c == 0) { 
     list.add(element); 
     c++; 
    } else { 
     int j = 0; 
     for (int i = 0; i < c; i++, j++) { 
      if (element.compareTo(list.get(i)) < 0) 
       break; 
     } 
     list.insert(j, element); 
     c++; 
    } 
} 

は、特別に空のリストについては、取り扱いが全く不要であるので、位置0に挿入すると同じです。しかし、それは「元のコード」を反映していない可能性があります。

もう少し微妙な違いは、10個以上の項目が挿入されても、このコードではエラーが発生しないことです。最初のコードの動作を正しく反映させるには、具体的にテストを追加する必要があります。

if (c == MAX_SIZE) 
    throw new ArrayIndexOutOfBoundsException(c); 

それはあなたの割り当ては、あなたがその条件を処理することを期待されていない可能性がありますが、それはそれは含まれていない場合は、リファクタリング機能の動作を変更していることを知っておく価値があります。

+0

@ボヘミアンこの答えはどうやって無関係でしょうか?むしろ、arraylistはすべての要素を保持するのに十分な能力を持っています - しかし、この答えはその事実にもかかわらず立っています。 –

+0

長い週の@spinter終了...あなたが正しいです! – Bohemian

関連する問題