Вектор сортировки в соответствии с заданной последовательностью - PullRequest
1 голос
/ 28 февраля 2011

Для данного вектора, подобного этому,

Vector<Temp> s = new Vector<Temp>();
s.add(new Temp("a",1));
s.add(new Temp("b",2));
s.add(new Temp("c",3));
s.add(new Temp("b",4));
s.add(new Temp("b",6));
s.add(new Temp("c",5));

желаемая последовательность (b, a, c)

после сортировки должно быть как

b,2  
b,4  
b,6  
a,1  
c,3  
c,5 

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

Есть идеи?

Ответы [ 4 ]

6 голосов
/ 28 февраля 2011

Вы должны написать собственный компаратор, который принимает последовательность в качестве аргумента и сравнивает элементы соответствующим образом.

Вот пример реализации:

public class Test {
    public static void main(String[] args) {
        Vector<Temp> s = new Vector<Temp>();
        s.add(new Temp("a",1));
        s.add(new Temp("b",2));
        s.add(new Temp("c",3));
        s.add(new Temp("b",4));
        s.add(new Temp("b",6));
        s.add(new Temp("c",5));

        String[] seq = { "b", "a", "c" };

        Collections.sort(s, new CustomComparator(seq));

        for (Temp tmp : s)
            System.out.println(tmp);
    }

    static class CustomComparator implements Comparator<Temp> {
        List<String> sequence;

        CustomComparator(String[] seq) {
            sequence = Arrays.asList(seq);
        }

        public int compare(Temp t1, Temp t2) {
            if (t1.s.equals(t2.s))
                return ((Integer) t1.i).compareTo(t2.i);
            return sequence.indexOf(t1.s) - sequence.indexOf(t2.s);
        }
    }
}

Вывод: (демонстрация ideone.com)

(b, 2)
(b, 4)
(b, 6)
(a, 1)
(c, 3)
(c, 5)
2 голосов
/ 28 февраля 2011

Просто быстрая идея: вы можете построить карту {b-> 0, a-> 1, c-> 2}, представляющую вашу последовательность, а затем использовать сопоставленные значения в компараторе вместо реальных полей.

0 голосов
/ 28 февраля 2011

Компаратор все еще применим здесь. Реализуйте сопоставимый интерфейс в своем классе и используйте и последовательность, и значение как часть вашей логики compareTo ().

0 голосов
/ 28 февраля 2011

Вы все еще можете использовать компаратор. Сначала сравните поля String и, если они равны, вместо возврата 0, сравните поля int. Ваш компаратор вернет ноль, только если оба поля идентичны.

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