Использование метода compareTo () каждый раз с другим свойством сортировки - PullRequest
0 голосов
/ 25 апреля 2019

Я использую метод compareTo() для сортировки ArrayList пользовательского объекта с именем image, но в моем приложении иногда требуется сортировать массив по определенному атрибуту, например goodMatches, и другимИногда мне нужно отсортировать массив в соответствии с другими атрибутами или свойствами объекта, но я не могу переопределить методы compareTo() более одного раза для разных сортов.

Я пытался использовать атрибут flags для объекта, ноПроблема в том, что другие атрибуты имеют тип float, и мне нужно сохранить метод compareTo, чтобы он возвращал float, а не целое число, как goodMatches.Может ли кто-нибудь помочь мне преодолеть эту проблему без необходимости создания другого класса объектов, любая помощь будет высоко оценена, ниже приведен мой код compareTo():

@Override
public int compareTo(image compareImg) {
    int compareMatches=((image)compareImg).getGoodMatches();      
    return compareMatches - this.goodMatches;
}

Ответы [ 2 ]

1 голос
/ 25 апреля 2019

Учитывая следующий Image класс (используйте заглавные буквы для имен классов)

class Image {
    private int goodMatches;
    private float anotherProperty;

    .....

    public int getGoodMatches() {
        return goodMatches;
    }

    public float getAnotherProperty() {
        return anotherProperty;
    }
}

Вы можете создать Comparator для каждого из ваших свойств:

class GoodMatchesComparator implements Comparator<Image> {
    @Override
    public int compare(Image i1, Image i2) {
        return Integer.compare(i1.getGoodMatches(), i2.getGoodMatches());
    }
}

class AnotherPropertyComparator implements Comparator<Image> {
    @Override
    public int compare(Image i1, Image i2) {
        return Float.compare(i1.getAnotherProperty(), i2.getAnotherProperty());
    }
}

Затем используйте метод сортировки в Списке для сортировки списка:

List<Image> images = new ArrayList<>();
// populate your list

// sort the list based on the goodMatches property
images.sort(new GoodMatchesComparator());

// sort the list based on the anotherProperty property
images.sort(new AnotherPropertyComparator());

Если вам нужен обратный порядок, вы можете сделать это следующим образом:

images.sort(new GoodMatchesComparator().reversed());
0 голосов
/ 25 апреля 2019

Вместо переопределения compareTo() попробуйте создать класс с именем Comparator, который создает компаратор (эксперт, который определяет, какой объект имеет более высокий приоритет), передавая реализацию ICompare.

public interface ICompare{
   compare(image obj1, image obj2);
}

Класс Comperator:

public class Comperator{
   ICompare icompare;
   Comperator(ICompare icompare){
      this.icompare = icompare;
   }

   public int compare(image img1, image img2){
      return icompare.compare(img1,img2);
   }
}

В заключение, создайте столько объектов Comperator, сколько вы хотите, передавая реализованный интерфейс, который вы хотите.Затем используйте его для сравнения объектов типа image.

Я хотел бы сказать вам здесь, что вы можете использовать Generics здесь, но я не просто потому, что хотел сохранить его простым и понятным!

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