Компаратор Java для простой пользовательской логики

Как мне найти строки 4, 1 и 6 в примере ниже?
И разумно ли в этом случае использование Collection.sort() с Компаратором?

       a -  b - c - d

1.)    6    8   16  18   
2.)    38  40   55  57  
3.)    6    8   25  27  
4.)    1    5   11  15  
5.)    6    8    3   5  
6.)    9   12   19  22   
7.)    18  20    1   3  
8.)    23  25   15  17 

Пример вверху представляет собой список с объектом, отвечающим следующим критериям:
- каждый объект содержит 4 целых числа (a,b,c,d),
- каждый объект в списке уникален,
- a ‹ б и в ‹ г.


Ниже приведен не рабочий пример, а мой способ мышления, как я могу ожидать, что компаратор будет работать для поиска ожидаемого объекта.

public class Row_Filter implements Comparable<Row_Filter>{
    int a,b,c,d;
    public Row_Filter(int a, int b, int c, int d) {
        this.a = a; this.b = b; this.c = c; this.d = d;
    }
   static class FilterAccordingAB implements Comparator<Row_Filter> {
        public int compare(Row_Filter o1, Row_Filter o2) {
            return o2.a - o1.b+1;
        }
    }
   static class FilterAccordingCD implements Comparator<Row_Filter> {
        public int compare(Row_Filter o1, Row_Filter o2) {
            return o2.c - o1.d+1;
        }
    }
   static class FilterAccordingABCD implements Comparator<Row_Filter> {
        public int compare(Row_Filter o1, Row_Filter o2) {
            FilterAccordingAB abF=null;    FilterAccordingCD cdF=null;
            if((abF.compare(o1, o2)==0) && (cdF.compare(o1, o2)==0)){
                return 1;
            }
            return -1;
        }
    }
} 

person jackdaniels    schedule 15.09.2010    source источник
comment
Будет ли это домашним заданием?   -  person Thorbjørn Ravn Andersen    schedule 15.09.2010
comment
Что особенного в строках 1,4 и 6?   -  person Eyal Schneider    schedule 15.09.2010
comment
с какими типами объектов вы имеете дело? ... так много вопросов означает, что ваш вопрос плохой!   -  person pstanton    schedule 15.09.2010
comment
Специально, это объекты, которые я должен объединить в своем списке в одну строку/объект --›(1 - 12 - 11 - 22).   -  person jackdaniels    schedule 15.09.2010
comment
@psanton: его общий объект с 4 целочисленными значениями. Вопрос неплохой вроде бы сложный!? ;-)   -  person jackdaniels    schedule 15.09.2010
comment
Для контекста это продолжение stackoverflow.com/questions/ 3712669/   -  person Péter Török    schedule 15.09.2010
comment
Строка 5 также имеет четыре уникальных значения с a‹b и c‹d. Вы имели в виду a‹b‹c‹d?   -  person DJClayworth    schedule 15.09.2010
comment
Классы-компараторы не находят вещи, они сравнивают вещи.   -  person DJClayworth    schedule 15.09.2010
comment
Вы смотрели на Java Docks для интерфейса Comparator? Я бы начал оттуда. Какой код вы написали? Где ты застрял? Мы не хотим делать вашу работу за вас, но мы более чем рады помочь, если у вас что-то не работает.   -  person aperkins    schedule 15.09.2010
comment
@DJClayworth: Хорошо, спасибо, может быть, у вас есть еще одна идея, как я могу определить компаратор, который дает мне истинный результат для сравнения строк 1 и 4 ??   -  person jackdaniels    schedule 15.09.2010
comment
@jackdaniels Вы до сих пор не сказали нам, что именно в строках 1 и 4 заставляет вас сравнивать их «равно», в то время как другие строки сравнивают «неравно». Или вы просто хотите знать, как вообще писать компаратор?   -  person DJClayworth    schedule 16.09.2010
comment
@DJClayworth: только такая строка, как a==b==c==d, не будет уникальной. И нет такого состояния, как a‹b‹c‹d. Между a‹b и c‹d есть только одно условие: они должны иметь одинаковый интервал (b-a)==(d-c). Но это уже сделано, каждый объект в списке соответствует этому критерию.   -  person jackdaniels    schedule 16.09.2010
comment
@pstanton: Нет, Антон, это не загадка, это просто реальный вопрос, как найти эти строки с помощью прог-языка java. Извините, если это звучит слишком глупо..   -  person jackdaniels    schedule 16.09.2010
comment
@aperkins: Да, я просмотрел Javadocs и просмотрел множество примеров. Но описывает только способ сравнения равных/не равных значений. Однако многие профессионалы предлагали использовать сравнительный/компаратор. Мой способ найти эти строки: 1.) сравнить значения obj1.b и obj2.a и obj1.d и obj2.c. И затем на 2-м шаге. Если obj1.b == obj2.a-1 и obj1.d == obj2.c-1, то я могу объединить этот объект. Мой вопрос был как раз о том, как определить эту логику с помощью компаратора.   -  person jackdaniels    schedule 16.09.2010


Ответы (2)


Что вам нужно сделать, так это реализовать интерфейс компаратора. Посмотрите JavaDocs для этого интерфейса. Вам нужно будет написать класс, который реализует этот интерфейс. Это включает в себя написание одного метода (вам не нужно переопределять equals()).

В метод передаются два объекта. Посмотрите, какое значение вам нужно вернуть из метода, чтобы показать, что два объекта «равны» в соответствии с вашими требованиями. Затем напишите код для возврата этого значения, когда они «равны», в соответствии с вашими требованиями.

Если что-то из этого неясно, вам нужно будет найти базовый учебник Java по написанию методов, написанию классов или использованию интерфейсов.

person DJClayworth    schedule 15.09.2010

Кажется, вы запутались, где бы вы использовали компаратор. DJClayworth точно описывает, КАК его создать. Вы могли бы использовать его, например, в механизме сортировки:

Collections.sort(myList, myComparator);

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

person aperkins    schedule 15.09.2010
comment
Спасибо, Аперкинс. Я не очень запутался, где использовать компаратор (в случае списка). Но как описать критерии соответствия компаратору в Comparator-Language. - person jackdaniels; 16.09.2010
comment
Я действительно смущен, если думаю о том, как уменьшить размер списка путем слияния объектов. Следуя этому пути, я должен создать 2-й список, перебирая 1-й список, копируя значения совпадающего объекта и вызывая каждый метод совпадения Collection.sort(). Для большего списка это кажется неэффективным решением. Если кому-то интересно, ниже ссылка на начальное описание всей проблемы. Ссылка: stackoverflow.com/questions/3712669/ - person jackdaniels; 16.09.2010