2013-05-16 2 views
0

Я хотел бы отсортировать список объектов. Каждый объект имеет имущество year и недвижимость name. Список Java должен быть отсортирован.Как отсортировать список по времени и подобию?

Класс:

public class Record { 
    String name; 
    int year; 
} 

В качестве примера, предположим, что мы имеем следующие записи (уже заказанные атрибутом года):

объектов/записей:

2000 Paul 
2000 Peter 
2000 paul 
2001 Paul P. 
2001 micael 
2001 jessica 
2002 Michael 

Поскольку в течение одного года существует несколько записей, я хочу сортировать по имени, чтобы si Милярные имена появляются как группа. Таким образом, после сортировки, список должен выглядеть следующим образом:

Желаемая Выход:

2000 Peter 
2000 Paul 
2000 paul 
2001 Paul P. 
2001 jessica 
2001 micael 
2002 Michael 

jessica < micael в 2001 году, потому что в 2002 году есть запись Майкл (который соответствует Микаэл с сходством метрики, такие как редактирование расстояние). Кроме того, Paul P. < jessica, потому что в 2000 году у нас также есть паульские записи. И paul records > Peter, потому что в 2001 году есть запись Павла П..

Я знаю о показателях сходства, таких как Jaro Winkler, Levenshtein и т. Д., И они также работают как и ожидалось в моем коде. Вопрос заключается в том, как заказать этот список в отношении двух размеров и как осуществить это с компаратора (это возможно даже с помощью простого компаратора?)

+0

Связать ли соответствующий класс с интерфейсом 'Comparable' и включить реализацию сортировки в переопределенном методе compareTo, а затем использовать' Collections # sort' для сортировки списка из них. Этот вопрос задается ежедневно.сначала сделайте небольшое расследование, прежде чем задавать вопрос. – mre

+0

Какова логика, определяющая, что '2000 Peter' указан перед' 2000 Paul'? Без какой-то определенной логики вы можете выразить словами, я не вижу, чтобы это никуда не помогало. –

+0

@AndrewThompson Спасибо, я объяснил это сейчас в первоначальном вопросе. 2000 Питер упоминается до 2000 года, потому что в 2001 году есть также запись Paul P. (которая соответствует Paul, если я использую метрику сходства строк). Таким образом, порядок не является буквенным. Это зависит от следующих/предыдущих записей. – Spiegelritter

ответ

0

Попробуйте использовать Collections.sort(), если вы используете List

Для пример:

List<String> test = new ArrayList<>(); 

    test.add("one"); 
    test.add("first"); 

    Collections.sort(test); 

    for (String output : test) { 
     System.out.println(output); 
    } 

Вывести «Первый», затем «один».

0

Используйте Collections.sort (список, компаратор) и реализуйте подходящий компаратор.

Поскольку вы не указали детали своего класса, ответы могут также быть только на метауровне.

+0

Спасибо, я добавил дополнительную информацию и объяснил дальнейший порядок записей. – Spiegelritter

1

Существует множество решений этой проблемы. У вас есть комментарий, предполагающий, что вы реализуете сопоставимые. Однако для многомерного сортировки я предпочитаю иметь два отдельных компаратора, которые я использую для сортировки списка в последовательности. При стабильном сортировке это дает возможность упорядочить ваши предметы по своему усмотрению. Вы сортируете по самому важному последнему ресурсу, поэтому вам нужно сортировать по имени, затем по году. В качестве альтернативы (и более эффективно) вы можете использовать com.google.common.collect.Ordering. Это находится в Guava library (отличный) и в основном супер компаратор. Вот как вы можете его использовать:

Comparator<MyObject> compareByYear = ... 
Comparator<MyObject> compareByLevenshteinDistance = ... 

Ordering<MyObject> orderByYear = Ordering.from(compareByYear); 
Ordering<MyObject> compoundOrdering = orderByYear.compound(compareByLevenshteinDistance); 

Collections.sort(myList,compoundOrdering); 

Обратите внимание, что вы можете создавать заказы напрямую. Я создал их отдельно, чтобы проиллюстрировать, что заказ является улучшением для компаратора. Надеюсь это поможет!

+0

Спасибо. Я попытался реализовать это, как вы его описали. Однако есть проблема, связанная с компаратором compareByLevenshteinDistance. Компаратор возвращает отрицательное значение, ноль или положительное значение. Оценка подобия - [0, 1], то есть я могу решить, когда мне нужно вернуть 0. В других случаях не ясно, что вернуть (если я верну строку stringA.compareTo (stringB), она будет упорядочена по алфавиту, но это не обязательно правильно. Порядок зависит от записей до и после. – Spiegelritter

Смежные вопросы