Java Comparable, множественные / разные реализации метода compareTo () - PullRequest
2 голосов
/ 17 июля 2011

У меня есть этот класс:

public class Sample implements Comparable<Sample> {
public String a;
public String b;
public String c;

public int compareTo (Sample sampleToCompare) {
int compResult = this.a.compareTo(sampleToCompare.a);
      return (compResult != 0 ? compResult : 
                   this.b.compareTo(sampleToCompare.b));    
    }
}

Я хочу, чтобы compareTo() вел себя или сортировал, используя различные свойства класса, в зависимости от того, установлен ли флаг.

Итак, если flag == 1 я бы хотел compareTo() использовать свойство c, в противном случае - flag == 0, что бы в данный момент не использовалось в методе.

Другими словами, сортируйте один и тот же класс по-разному.

Я не уверен, как этого добиться. Пожалуйста, помогите.

Также, пожалуйста, дайте мне знать, если мне нужна дополнительная информация.

Ответы [ 3 ]

4 голосов
/ 17 июля 2011

Если вы хотите реализовать сортировку другого типа, вам следует взглянуть на интерфейс java.util.Comparator .

public class SampleComparatorA implement Comparator<Sample> {

    public int compare(Sample a, Sample b) {
        // Your sorting
    }
}

И используйте java.util.Collections.sort () метод с Comparator в качестве параметра secound.

Collections.sort(aSampleList, new SampleComparatorA());
3 голосов
/ 17 июля 2011

Как насчет:

public int compareTo(Sample sampleToCompare) {
    if (flag == 1) {
        return this.c.compareTo(sampleToCompare.c);
    }
    if (flag == 0) {
        // current stuff
    }
    ...
}

Хотя это не очень объектно-ориентированный способ. Вероятно, у вас должно быть два разных компаратора и способ их выбора на основе значения вашего «флага». Что-то вроде:

class Sample {
    private String a;
    private String b;
    private String c;
}

class ASampleComparator implements Comparator<Sample> {
    public int compare(Sample o1, Sample o2) {
        return o1.a.compareTo(o2.a);
    }
}

class BSampleComparator implements Comparator<Sample> {
    public int compare(Sample o1, Sample o2) {
        return o1.b.compareTo(o2.b);
    }
}

class CSampleComparator implements Comparator<Sample> {
    public int compare(Sample o1, Sample o2) {
        return o1.c.compareTo(o2.c);
    }
}

public Comparator<Sample> pickComparator(int flag) {
    switch (flag) {
        case 0:
            return new ASampleComparator();
        case 1:
            return new BSampleComparator();
        case 2:
            return new CSampleComparator();
        default:
            throw new IllegalArgumentException("Bad flag value: " + flag);
    }
}
1 голос
/ 17 июля 2011

Вы должны сделать свой флаг статичным, чтобы сравнение было согласованным (как описано в Effective Java, элемент 12 ), в противном случае вы можете получить, что a.compareTo(b) возвращает это a > b, но b.compareTo(a) возвращает это b > a. Итак, простейшая реализация, о которой я могу подумать:

public class Sample implements Comparable<Sample> {
public String a;
public String b;
public String c;
public static boolean my_flag = false;

public int compareTo (Sample sampleToCompare) {
    if (flag) {
        return this.c.compareTo(sampleToCompare.c);
    }
    int compResult = this.a.compareTo(sampleToCompare.a);
      return (compResult != 0 ? compResult : 
                   this.b.compareTo(sampleToCompare.b));    
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...