Как отсортировать Набор <T>?

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

51
задан Radiodef 14 April 2015 в 16:09
поделиться

6 ответов

Коллекции сами по себе не имеют предопределенного порядка, поэтому вы должны преобразовать их в 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
68
ответ дан 7 November 2019 в 10:07
поделиться

Коллекция не имеет упорядочения, поэтому сортировать ее не имеет смысла. Вы можете сортировать экземпляры и массивы List , и методы для этого: Collections.sort () и Arrays.sort ()

9
ответ дан 7 November 2019 в 10:07
поделиться

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

Однако, если это не список, и вам не очень важно, какой тип объекта коллекции возвращается, я думаю, что быстрее будет создать TreeSet вместо List:

TreeSet sortedSet = new TreeSet(myComparator);
sortedSet.addAll(myCollectionToBeSorted);
6
ответ дан 7 November 2019 в 10:07
поделиться

Вы не можете, если T - это все, что вы получаете. Он должен быть введен провайдером:

Collection<T extends Comparable>

или передан в Comparator

Collections.sort(...)
5
ответ дан 7 November 2019 в 10:07
поделиться

У вас есть два основных варианта, предоставляемых java.util.Collections:

  • > void sort(List list)
    • Используйте это, если T реализует Comparable и вас устраивает такое естественное упорядочивание
  • void sort(List list, Comparator c)
    • Используйте это, если вы хотите предоставить свой собственный Comparator.

В зависимости от того, что представляет собой Коллекция, вы также можете рассмотреть SortedSet или SortedMap.

6
ответ дан 7 November 2019 в 10:07
поделиться

Вот пример. (Для удобства я использую класс 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();
            }
        }
    }
}

Если у вас есть конкретный код, над которым вы работаете и у вас возникают проблемы, вы можете опубликовать свой псевдокод, и мы постараемся вам помочь!

1
ответ дан 7 November 2019 в 10:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: