В алфавитном порядке Отсортируйте Набор Java, основанный на 'toString' значении его членских объектов

Вы можете использовать оператор CASE, чтобы сделать это

select count(id) as id_name, 
       case when category = 'Laki-laki'  then 'Umum' else category end as media  
from tb_gadar
where d BETWEEN '2018-04-01' and '2019-12-31'
and category in ('Laki-laki','Perempuan')
group by category
25
задан double-beep 31 January 2019 в 18:22
поделиться

10 ответов

Используйте API sort(List list, Comparator c), который определяет компаратор, и реализуйте его так, как вы хотите.

В качестве альтернативы, если вам конкретно не нужен список, используйте SortedSet , то же самое относится и к компаратору.

18
ответ дан Yuval Adam 28 November 2019 в 17:36
поделиться
Collections.sort(fooList,
                 new Comparator<Foo>()
                 {
                     public int compare(Foo f1, Foo f2)
                     {
                         return f1.toString().compareTo(f2.toString());
                     }        
                 });

Предполагая, что toString никогда не возвращает ноль и что в списке нет нулевых элементов.

67
ответ дан Dan Dyer 28 November 2019 в 17:36
поделиться
public class Foo
   implements Comparable<Foo>
{

    private String aField;

    public Foo(String s)
       {
       aField=s;
        }


    public String getAField()
        {
        return aField;
        }

   public int compareTo(Foo other)
        {
        return getAField().compareTo(other.getAField());
        }


    @Override
    public String toString()
    {
    return getAField();
    }

}

и затем

Collections.sort (список);

7
ответ дан Pierre 28 November 2019 в 17:36
поделиться

Я сделал бы что-то очень похожее на Pierre:

public class Foo implements Comparable<Foo>
{
    private String aField;

    @Override
    public String toString()
    {
        return aField;
    }

    public int compareTo(Foo o)
    {
        return this.toString().compareTo(o.toString());
    }
}

Затем как Pierre, я использовал бы Collections.sort(list), как Pierre предполагает.

5
ответ дан RAS 28 November 2019 в 17:36
поделиться

Версия Java 8:

list.sort(Comparator.comparing(Object::toString));

Или потоковая передача:

List<Foo> sortedList = unsortedList
    .stream()
    .sorted(Comparator.comparing(Object::toString)))
    .collect(Collectors.toList());
5
ответ дан David Leppik 28 November 2019 в 17:36
поделиться

Я настоятельно рекомендовал бы Вам только использовать toString для отладки целей... однако..., чтобы подробно остановиться на том, что Yuval A записал выше...

public class X
    implements Comparator
{
    public int compare(final Foo a, final Foo b) 
    {
        return (a.toString().compareTo(b.toString()));
    }
}

Однако Вы действительно должны сделать, чтобы Foo реализовал Comarable или записал надлежащий Compartor, который не использует toString.

3
ответ дан TofuBeer 28 November 2019 в 17:36
поделиться

lambdaj позволяет сортировать, фильтровать и вообще манипулировать коллекциями без написания циклов или неясных внутренних классов. Например, сортировка, которую вы запрашивали, может быть достигнута следующим образом:

sort(foos, on(Foo.class).toString());

Если вы заинтересованы в этом, проверьте это по адресу:

http://code.google .com / р / lambdaj /

3
ответ дан sth 28 November 2019 в 17:36
поделиться

Если Вы хотите, чтобы набор остался отсортированным, вместо того, чтобы сортировал его в отдельных моментах, Вы могли поместить его в TreeSet с определенным Компаратором. Иначе я использовал бы метод Collections.sort, уже упомянутый Yuval.

1
ответ дан Paul Tomblin 28 November 2019 в 17:36
поделиться

Вид ArrayList на свойстве интервала POJO (Возрастание или Убывание):

Collections.sort(myPojoList, (a, b) -> a.getId() - b.getId()); //ASC
Collections.sort(myPojoList, (a, b) -> b.getId() - a.getId()); //DESC

//Alternatively use Integer.compare()
Collections.sort(myPojoList, (a, b) -> Integer.compare(a.getId(), b.getId())); //ASC
Collections.sort(myPojoList, (a, b) -> Integer.compare(b.getId(), a.getId())); //DESC

Вид ArrayList на Свойстве строки POJO:

Collections.sort(myPojoList, (a, b) -> a.getName().compareTo(b.getName())); //ASC
Collections.sort(myPojoList, (a, b) -> b.getName().compareTo(a.getName())); //DESC

Вид ArrayList на булево свойстве POJO:

Collections.sort(myPojoList, (a, b) -> Boolean.compare(a.isMale(), b.isMale())); //ASC
Collections.sort(myPojoList, (a, b) -> Boolean.compare(b.isMale(), a.isMale())); //DESC

Дополнительный: получите отличный ArrayList

myPojoList= new ArrayList<>(new LinkedHashSet<>(myPojoList)); //Distinct
0
ответ дан 28 November 2019 в 17:36
поделиться

google-collections делает это очень легко с помощью Ordering :

Collections.sort(list, Ordering.usingToString());

целая сторонняя библиотека, чтобы использовать то, что вы могли бы тривиально написать с помощью компаратора (как другие предоставили) стоящего? Нет, но коллекции google - это так здорово, что вы все равно захотите иметь их по ряду других причин.

На фронте сортировки вы также можете легко делать такие вещи, как реверсирование:

Ordering.usingToString().reverse();

или разрыв связей:

Ordering.usingToString().compound(someOtherComparator);

] или иметь дело с нулями:

Ordering.usingToString().nullsFirst();

и т. д., но там есть еще куча вещей (конечно, не только связанных с сортировкой), которые приводят к действительно выразительному коду. Оцените это!

17
ответ дан 28 November 2019 в 17:36
поделиться
Другие вопросы по тегам:

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