2011-02-08 11 views
0

私が書いたクラスのaddメソッドに問題があるようです。配列を使用してSortedListを作成したいのですが、問題が何であるかわかりません。これは私のコードです:私は私のリストに2つの整数を追加する場合配列でJavaで並べ替えリストを実装する際の問題

public class SortedList { 

    private Integer[] elements; 
    private int size; 
    private int capacity; 

    public SortedList(int cap) { 

     elements = new Integer[cap]; 

     if (cap > 0) 
     { 
      cap = capacity; 
     } 
     else 
      capacity = 10; 

    } 

    public boolean isEmpty() 
    { 
     return size == 0; 
    } 

    public boolean isFull() 
    { 
     return size == capacity; 
    } 

    public int size() 
    { 
     return size; 
    } 

    public void doubleCapacity() 
    { 
     capacity = capacity * 2; 
    } 

    public void add(Integer el) 
    { 
     if(this.isEmpty()) 
     { 
      elements[0] = el; 
      size++; 
     } 

     else if(this.isFull()) 
     { 
      this.doubleCapacity(); 
      for(int i = 0; i<this.size(); i++) 
      { 
       if(el >= elements[i]) 
       { 
        elements[i+2] = elements[i+1]; 
        elements[i+1] = el; 
       } 

       else 
       { 
        elements[i+1] = elements[i]; 
        elements[i] = el; 
       } 
      } 
      size++; 
     } 
     else 
     { 
      for(int i = 0; i<this.size(); i++) 
      { 
       if(el >= elements[i]) 
       { 
        elements[i+2] = elements[i+1]; 
        elements[i+1] = el; 
       } 
       else 
       { 
        elements[i+1] = elements[i]; 
        elements[i] = el; 
       } 
      } 
      size++; 
     } 

    } 

    public String toString() 
    { 
     String s = ""; 
     s = s + "<SortedList["; 
     for(int i = 0; i < this.size(); i++) 
     { 
      s = s + elements[i]; 
      if(i < this.size()-1) 
       s = s + ","; 
     } 
     s = s + "]>"; 
     return s; 
    } 


    public static void main(String[] args) 
    { 
     SortedList sl = new SortedList(5); 
     sl.add(3); 
     //sl.add(2); 
     sl.add(4); 
     sl.add(5); 
//  sl.add(6); 
     System.out.println(sl.toString()); 
    } 



} 

私のコードは動作しますが、私は数字3,4,5を追加しようとすると、私は3,5,5-を取得...

何が問題なのですか?ありがとう..

+0

これは宿題ですか? – jny

+0

それはやり取りですが、私はそれをする必要はありません。私はちょうど配列でこれを行う方法を学びたい! – Loolooii

答えて

1

パブリッククラスSortedListの{

private Integer[] elements; 
private int size=0; 
private int capacity; 

public SortedList(int cap) { 

    elements = new Integer[cap]; 

    if (cap > 0) 
    { 
     capacity = cap; 
    } 
    else 
     capacity = 10; 

} 

public boolean isEmpty() 
{ 
    return size == 0; 
} 

public boolean isFull() 
{ 
    return size == capacity; 
} 

public int size() 
{ 
    return size; 
} 

public void doubleCapacity() 
{ 
    capacity = capacity * 2; 
} 

public void add(Integer el) throws Exception{ 
    elements[size] = el; 
    size++; 
    if(size>capacity){ 
     throw new Exception("Size Exceeded"); 
    } 
} 

public String toString() 
{ 
    sort(); 
    String s = ""; 
    s = s + "<SortedList["; 
    for(int i = 0; i < this.size(); i++) 
    { 
     s = s + elements[i]; 
     if(i < this.size()-1) 
      s = s + ","; 
    } 
    s = s + "]>"; 
    return s; 
} 

public void sort(){ 
    for (int i=0; i <size()-1; i++) { 
     if (elements[i] > elements[i+1]) { 
      // exchange elements 
      int temp = elements[i]; 
      elements[i] = elements[i+1]; 
      elements[i+1] = temp; 
     } 
    } 
} 

public static void main(String[] args) 
{ 
    try { 
     SortedList sl = new SortedList(5); 
     sl.add(3); 
     //sl.add(2); 
     sl.add(6); 
     sl.add(5); 

// sl.add(6)。 System.out.println(sl.toString()); } catch(Exception ex){ Logger.getLogger(SortedList.class.getName())。log(Level.SEVERE、null、ex); }}

}

+0

そして返信してください。 – Ankit

+0

ありがとう!すばらしいです.. – Loolooii

1

あなたの挿入コードは機能しません。

elements[i+1] = elements[i]; 
elements[i] = el; 

elements[i+1]の古い値はどうなりますか?

+0

私はそれを変数に格納しなければならないのですか? – Loolooii

+0

@Nima:あなたが挿入を終えた後、 'elements [i + 1]'はどこで終わるべきですか? –

+0

挿入したい整数の後ろに? – Loolooii

1

以前の解決策に以下の変更をお勧めします。 toString()でsortを呼び出すだけであれば、ソートされていない複数の要素が連続している場合にリストがすぐに順不同になります(これでtoString()からsort()を削除できました)。これは本質的に迅速な挿入の並べ替えであり、すぐにリストをスワップすることができなくなると終了します。繰り返しになりますが、dtyが示唆するように、挿入ポイントを見つけるためのバイナリ検索がより高速に選択できます。

public void doubleCapacity(){

capacity = capacity * 2; 
Integer temp[] = new Integer[capacity]; 
for (int i = 0; i < size; i++){ 
    temp[i] = elements[i]; 
} 
elements = temp; 

}

public void add(Integer el){

if(size+1>capacity){ 
    doubleCapacity(); 
} 
elements[size] = el; 
size++; 
sort(); 
} 

public void sort(){

//Iterates down the list until it's sorted. 
for (int i=size()-2; i >= 0 && (elements[i] < elements[i+1]); i--) { 
     // exchange elements 
     int temp = elements[i]; 
     elements[i] = elements[i+1]; 
     elements[i+1] = temp; 
} 

}

+0

私は本当にバブルソートなしでこれを行う必要があります.. – Loolooii

+0

それを忘れてください。リストがすでにソートされていると仮定している場合(定義上必要)、バイナリ検索を使用して挿入ポイントを探します。 – dty

+0

ああ、良いポイントdty。あなたの提案は間違いなく速く実行されるだろう、私はそれを忘れていた。配列フレームワークを使用することができれば、それに応じて簡単に値をシフトできます。 – Cooper

関連する問題