2009-06-07 1 views
0

ok;私は学校のためのプロジェクトを作っており、落ちる砂に似たゲームをしています。しかし、重力が作用するためには、私は砂をその位置によってソートしなければなりません(この砂の変数)。このメソッドはそれをソートする必要があります。 .clone()を動作させることはできませんが、私が知っている他の方法でハードコピーすることはできません。だから、私はこのコードのすべてのコメントを、彼らが言うことをする何かに置き換える方法を知らない。自己作成クラスのarraylistをその変数の1つでソートすると、clone()は機能しません。

これをどのように動作させるか説明するには、私はソートされたソートされたものを並べて、世界から要素を取り除きたい。

public void sort(){ 
    //method to sort elements by y value 
    ArrayList<sand> sorted=new ArrayList<sand>(); 
    if(world.size()!=0){ 
     //code to take 0 from world and place it into sorted at 0 
     while(world.size()>0){ 
      boolean check=true; 
      for(int i=0;i<sorted.size();i++){ 
       if(world.get(0).y<sorted.get(i).y){ 
       //code to take 0 from world and place it into sorted at i 
       check=false; 
       } 
      } 
      if(check){ 
       //code to take 0 from world and place it at the end 
      } 
     } 
    } 
    //code to make sorted the contents of world 
    } 

私はクローンを取得していますエラーは次のとおりです。

awesomesand.java:48: clone() has protected access in java.lang.Object 
      sand a=world.get(0).clone(); 

と、そう世界は型砂のです。


EDITは、今私は、クローニング上のエラーを取得しています。

awesomesand.java:48: incompatible types 
found : java.lang.Object 
required: awesomesand.sand 
      sand a=world.get(0).clone(); 
            ^
+2

のJava規則は、大文字、すなわち砂、ない砂でクラス名を開始することです。これを行うと、コードは読みやすくなります(少なくとも、通常の慣習に慣れていれば)。 – bm212

答えて

2

Objectでアクセスを保護しているため、クローン例外が発生しています。ただし、標準的なソートメカニズムCollectionsを呼び出す場合、ArrayListのソートにはclone()は必要ありません。

なぜクローンエラーが発生するのかについては、クラスはパブリックアクセスでclone()をオーバーライドする必要があります。これは、あなたのクラスの詳細を取り扱うことを保証するためにされています。しかし、より簡単に、より効率的に、そしてより多くの可能性が正しい、ちょうど直接砂のオブジェクトのコレクションを並べ替えることです

public class Sand implements Cloneable { 
    public Object clone() throws CloneNotSupportedException { 
     Sand copy = (Sand) super.clone(); 
     // Sand specific copying done here 
     return copy; 
    } 
} 

。ここで私は、砂の可能なバージョンを定義し、Collections.sortを使用することを示しました:

public class Sand { 
    public int x; 
    public int y; 
} 

public class SandComparator implements Comparator<Sand> { 
    public int compare(Sand s1, Sand s2) { 
     // reverse these to sort in the opposite order 
     return s1.y - s2.y; 
    } 
    public boolean equals(Object o) { 
     return o instanceof SandComparator; 
    } 
} 

public class App { 
    ArrayList<Sand> world; 
    ... 
    public void sort() { 
     Collections.sort(world, new SandComparator()); 
    } 
} 
1

これはおそらく、「彼ら」があなたのオブジェクトの浅いコピーを必要としているのか、それとも深いコピーが必要なのかを考えさせたいからでしょう。 砂のクラスでは、clone()メソッドを実装する必要があります。また、Cloneableインターフェイスを実装する必要があります。

public class sand implements Cloneable 
{ 
    public Object clone() throws CloneNotSupportedException 
    { 
     return super.clone(); 
    } 
} 

これにより、浅いコピーが作成されます。

免責事項:私は積極的にJavaを使用して以来、年を重ねていますが、これが役立つことを願っています。

PS:あなたは確かにあなたのクラス名:)

+0

よろしくお願い致します。 ps:私はパスカルキャスティング(笑) – crazybmanp

2

私はこれを正しく理解していれば、私はあなただけの並べ替え配列にしたいと思うのためPascalCasingを使用する必要があります。その場合、クローンが本当に必要ではないと私は思います。

おそらく、ComparatorとCollections.sortList()メソッドを使ってワールド配列を正しい順序(コンパレータの実装によって順序が決定される)にソートすることができます。ワールドの代わりに別の配列を使用する必要がある場合は、適切なArrayListコピーコンストラクタまたはSystem.arraycopyを使用して、まずワールドのコピーを作成してから、代わりにその配列をソートすることができます。

+0

いいえ、私はそれを砂のクラスy変数の値でソートしています。 – crazybmanp

+0

Comparatorを使用すると、y値でSandインスタンスの配列を並べ替えることができます。 – bm212

+0

yea;チャドウィックは実装をしました。ありがとう(私はあなたが私がそれをやっていた方法について何を言っているのか誤解している)。 – crazybmanp

0

bm212が指摘している点を除いて(Collections.sortを使用してください)、ソート方法は機能しません。あなたはあなたのリストをループして、あなたのピボットよりも小さな要素をすべて冒頭に配置し、他のすべての要素を最後に配置します。これはソートされたリストを取得するには不十分です。あなたが本当にあなた自身のソートを実装する場合は、単純な挿入やバブルソートはあなたの最善の策かもしれ

http://en.wikipedia.org/wiki/Insertion_sort

http://en.wikipedia.org/wiki/Bubble_sort

ああ、とcloneを使用して忘れる、私は本当にあなたのケースでそれが必要であるか疑問に思う。

+0

実際には、これは挿入ソートを行うことです。ピボットは値から値に移動する必要があります。それは、フィッティングしなければならない場所が見つかるか、それが最後にあり、それがまだ新しいarraylistにない場合です。それは最後にそれを置くべきです。 – crazybmanp

+0

ええ、私はなぜ彼が最初の場所で物事をクローンする必要があるのだろうかと思っていた:) – Thorarin

関連する問題