У меня есть общий Collection
, и я пытаюсь выяснить, как я могу сортировать элементы, содержащиеся в нем. Я пробовал несколько вещей, но я не могу заставить их работать.
Как отсортировать коллекцию <T>?
Ответ 1
Коллекции сами по себе не имеют предопределенного порядка, поэтому вы должны преобразовать их в
a java.util.List
. Затем вы можете использовать одну форму java.util.Collections.sort
Collection< T > collection = ...;
List< T > list = new ArrayList< T >( collection );
Collections.sort( list );
// or
Collections.sort( list, new Comparator< T >( ){...} );
// list now is sorted
Ответ 2
A Collection
не имеет упорядочения, поэтому его сортировка не имеет смысла. Вы можете отсортировать экземпляры и массивы List
, а методы для этого - Collections.sort()
и Arrays.sort()
Ответ 3
Если ваш объект коллекции является списком, я бы использовал метод сортировки, как это предлагается в других ответах.
Однако, если это не список, и вам не важно, какой тип объекта Collection будет возвращен, я думаю, что быстрее создать TreeSet вместо List:
TreeSet sortedSet = new TreeSet(myComparator);
sortedSet.addAll(myCollectionToBeSorted);
Ответ 4
У вас есть два основных варианта: java.util.Collections
:
-
<T extends Comparable<? super T>> void sort(List<T> list)
- Используйте это, если
T implements Comparable
и вы в порядке с этим естественным упорядочением
- Используйте это, если
-
<T> void sort(List<T> list, Comparator<? super T> c)
- Используйте это, если вы хотите предоставить свой собственный
Comparator
.
- Используйте это, если вы хотите предоставить свой собственный
В зависимости от того, что есть Collection
, вы также можете посмотреть SortedSet
или SortedMap
.
Ответ 5
Вы не можете, если T - это все, что вы получаете. У вас должен быть введен его поставщик через:
Collection<T extends Comparable>
или передать в Comparator методом Collections.sort(...)
Ответ 6
Вот пример. (Я использую класс CompareToBuilder
из Apache для удобства, хотя это можно сделать без его использования.)
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import org.apache.commons.lang.builder.CompareToBuilder;
public class Tester {
boolean ascending = true;
public static void main(String args[]) {
Tester tester = new Tester();
tester.printValues();
}
public void printValues() {
List<HashMap<String, Object>> list =
new ArrayList<HashMap<String, Object>>();
HashMap<String, Object> map =
new HashMap<String, Object>();
map.put( "actionId", new Integer(1234) );
map.put( "eventId", new Integer(21) );
map.put( "fromDate", getDate(1) );
map.put( "toDate", getDate(7) );
list.add(map);
map = new HashMap<String, Object>();
map.put( "actionId", new Integer(456) );
map.put( "eventId", new Integer(11) );
map.put( "fromDate", getDate(1) );
map.put( "toDate", getDate(1) );
list.add(map);
map = new HashMap<String, Object>();
map.put( "actionId", new Integer(1234) );
map.put( "eventId", new Integer(20) );
map.put( "fromDate", getDate(4) );
map.put( "toDate", getDate(16) );
list.add(map);
map = new HashMap<String, Object>();
map.put( "actionId", new Integer(1234) );
map.put( "eventId", new Integer(22) );
map.put( "fromDate", getDate(8) );
map.put( "toDate", getDate(11) );
list.add(map);
map = new HashMap<String, Object>();
map.put( "actionId", new Integer(1234) );
map.put( "eventId", new Integer(11) );
map.put( "fromDate", getDate(1) );
map.put( "toDate", getDate(10) );
list.add(map);
map = new HashMap<String, Object>();
map.put( "actionId", new Integer(1234) );
map.put( "eventId", new Integer(11) );
map.put( "fromDate", getDate(4) );
map.put( "toDate", getDate(15) );
list.add(map);
map = new HashMap<String, Object>();
map.put( "actionId", new Integer(567) );
map.put( "eventId", new Integer(12) );
map.put( "fromDate", getDate(-1) );
map.put( "toDate", getDate(1) );
list.add(map);
System.out.println("\n Before Sorting \n ");
for( int j = 0; j < list.size(); j++ )
System.out.println(list.get(j));
Collections.sort( list, new HashMapComparator2() );
System.out.println("\n After Sorting \n ");
for( int j = 0; j < list.size(); j++ )
System.out.println(list.get(j));
}
public static Date getDate(int days) {
Calendar cal = Calendar.getInstance();
cal.setTime(new Date());
cal.add(Calendar.DATE, days);
return cal.getTime();
}
public class HashMapComparator2 implements Comparator {
public int compare(Object object1, Object object2) {
if( ascending ) {
return new CompareToBuilder()
.append(
((HashMap)object1).get("actionId"),
((HashMap)object2).get("actionId")
)
.append(
((HashMap)object2).get("eventId"),
((HashMap)object1).get("eventId")
)
.toComparison();
} else {
return new CompareToBuilder()
.append(
((HashMap)object2).get("actionId"),
((HashMap)object1).get("actionId")
)
.append(
((HashMap)object2).get("eventId"),
((HashMap)object1).get("eventId")
)
.toComparison();
}
}
}
}
Если у вас есть определенный код, над которым вы работаете, и у вас есть проблемы, вы можете опубликовать свой псевдокод, и мы можем попытаться помочь вам!
Ответ 7
Предполагая, что у вас есть список объектов типа Person, используя выражение Lambda, вы можете сортировать имена пользователей, например, следующим образом:
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
class Person {
private String firstName;
private String lastName;
public Person(String firstName, String lastName){
this.firstName = firstName;
this.lastName = lastName;
}
public String getLastName(){
return this.lastName;
}
public String getFirstName(){
return this.firstName;
}
@Override
public String toString(){
return "Person: "+ this.getFirstName() + " " + this.getLastName();
}
}
class TestSort {
public static void main(String[] args){
List<Person> people = Arrays.asList(
new Person("John", "Max"),
new Person("Coolio", "Doe"),
new Person("Judith", "Dan")
);
//Making use of lambda expression to sort the collection
people.sort((p1, p2)->p1.getLastName().compareTo(p2.getLastName()));
//Print sorted
printPeople(people);
}
public static void printPeople(List<Person> people){
for(Person p : people){
System.out.println(p);
}
}
}