сортировка массива самодельного класса по одной из его переменных и clone () не будет работать - PullRequest
0 голосов
/ 08 июня 2009

ки; Я делаю проект для школы, и это игра, похожая на падающий песок. но чтобы гравитация работала, мне нужно отсортировать песок по его положению снизу вверх (переменная y песка), этот метод должен отсортировать его; хотя я не могу заставить работать .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();
                                     ^

Ответы [ 4 ]

2 голосов
/ 08 июня 2009

Вы получаете исключение клона, потому что оно имеет защищенный доступ в Object. Однако сортировка ArrayList не требует clone(), если вы вызываете стандартные механизмы сортировки Collections .

Что касается того, почему вы получаете ошибку клона, класс должен переопределить clone() с открытым доступом. Это гарантирует, что вы справитесь со спецификой вашего класса:

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

Однако проще, эффективнее и, скорее всего, правильно, просто отсортировать коллекцию песчаных объектов напрямую. Здесь я определил возможную версию Sand и покажу использование 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());
    }
}
2 голосов
/ 08 июня 2009

Если я правильно понимаю, я думаю, вы хотите просто отсортировать массив. Если это так, я не думаю, что клон действительно необходим.

Возможно, вы можете попробовать использовать Comparator и метод Collections.sortList (), чтобы отсортировать массив миров в правильном порядке (где порядок определяется реализацией Comparator). Если вам нужно использовать другой массив вместо мира, вы можете просто сначала сделать копию мира, используя соответствующий конструктор копирования ArrayList, или System.arraycopy, а затем отсортировать этот массив.

1 голос
/ 08 июня 2009

Вероятно, потому, что «они» хотят заставить вас задуматься о том, нужна ли вам мелкая копия вашего объекта или глубокая копия. В вашем классе sand вам необходимо реализовать метод clone (). Вам также необходимо реализовать интерфейс Cloneable:

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

Это создаст мелкую копию.

Отказ от ответственности: прошло уже много лет с тех пор, как я активно использовал Java, но я надеюсь, что это поможет.

PS: Вы действительно должны использовать PascalCasing для имен классов:)

0 голосов
/ 08 июня 2009

Помимо того, что указал bm212 (используйте Collections.sort), позвольте мне указать, что ваш метод сортировки не будет работать. Вы просто перебираете свой список и помещаете все элементы меньше, чем ваша пивот в начале, а все остальные в конце - этого недостаточно для получения отсортированного списка.

Если вы действительно хотите реализовать собственную сортировку, лучше всего подойдет простая вставка или пузырьковая сортировка:

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

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

Да, и забудьте об использовании clone, я действительно сомневаюсь, что вам это нужно в вашем случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...