2017-02-17 18 views
2

У меня есть сортировка объекта MasterPayee на основе кода категории Payee с алфавитным порядком Теперь мне нужно получить код категории Другие услуги, который будет последним в отсортированном СписокСортировка объектов с использованием java-компаратора, но с фиксированным значением должна быть в последнем значении в отсортированном списке

Список после сортировки применяется

Financial and Insurance services 

Government Sectors 

Other Services 

Telecommunications and Utilities 

Transportation Services 

Обязательный список следующим

Financial and Insurance services 
Government Sectors 
Telecommunications and Utilities 
Transportation Services 
Other Services 

нужно для того чтобы достигнуть Другие услуги, как последний в списке После Компаратор используется для сортировки списка

Collections.sort(masterPayees, getCategoryNameComparatorByMasterPayee()); 

private Comparator<MasterPayee> getCategoryNameComparatorByMasterPayee() { 
    Comparator<MasterPayee> categoryNameComparatorByMasterPayee = new Comparator<MasterPayee>() { 
     public int compare(MasterPayee o1, MasterPayee o2) { 
      return (((MasterPayee) o1).getPayee_category().toString() 
        .compareToIgnoreCase(((MasterPayee) o2).getPayee_category().toString())); 
     } 

    }; 
    return categoryNameComparatorByMasterPayee; 
} 

Другие услуги должны всегда быть последним в отсортированном списке

+0

Возможный дубликат [Заказ с частичной явной, а затем другой порядок?] (Http://stackoverflow.com/questions/42125743/ordering -with-partial-explicit-and-then-another-order) – MikaelF

ответ

0

Вы можете использовать guava'a Заказ, если вы знаете все значения, которые могут быть отсортированы.

Чтобы создать компаратор вы можете speccify свои значения, как это:

Ordering<String> ordering1 = Ordering.explicit("Financial and Insurance services","Government Sectors","Telecommunications and Utilities","Transportation Services","Other Services"); 

Вы также можете предоставить список с вашими значениями в качестве аргумента Ordering.explicit().

+0

Возможно, вы должны добавить немного подробностей к этому ответу. –

+1

Вы правы. Готово! – MicD

3

Попробуйте это:

Comparator<MasterPayee> categoryNameComparatorByMasterPayee = new Comparator<MasterPayee>(){ 
    public int compare(MasterPayee o1, MasterPayee o2) { 
     if (((MasterPayee) o1).getPayee_category().toString().equalsIgnoreCase("Other Services") && ((MasterPayee) o1).getPayee_category().toString().equalsIgnoreCase(((MasterPayee) o2).getPayee_category().toString())) { 
      return 0; 
     } 
     else if (((MasterPayee) o1).getPayee_category().toString().equalsIgnoreCase("Other Services")) { 
      return 1; 
     } 
     else if (((MasterPayee) o2).getPayee_category().toString().equalsIgnoreCase("Other Services")) { 
      return -1; 
     } 
     else return (((MasterPayee) o1).getPayee_category().toString().compareToIgnoreCase(((MasterPayee) o2).getPayee_category().toString())); 
    } 
}; 

Он обрабатывает объект с «Другие услуги» всегда как «больше», таким образом, делая его в конце.

+0

Он работает как ожидалось спасибо – Kiran

0

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

private Comparator<MasterPayee> getCategoryNameComparatorByMasterPayee() { 
    Comparator<MasterPayee> categoryNameComparatorByMasterPayee = new Comparator<MasterPayee>() { 
     public int compare(MasterPayee o1, MasterPayee o2) { 
      String s1 = ((MasterPayee) o1).getPayee_category().toString(); 
      String s2 = ((MasterPayee) o1).getPayee_category().toString(); 
      boolean b1 = s1.equalsIgnoreCase("Other Services"); 
      boolean b2 = s2.equalsIgnoreCase("Other Services"); 

      return b1 ? (b2 ? 0 : 1) : (b2 ? -1 : s1.compareToIgnoreCase(s2)); 
     } 
    }; 
    return categoryNameComparatorByMasterPayee; 
} 

Это позволяет избежать сложного для чтения кода и, следовательно, его трудно поддерживать. И если нам нужно изменить логику здесь, нам может потребоваться внести минимальные изменения.

+0

Здесь b1 и b2 вернут int, и он выдает ошибку времени компиляции – Kiran

+0

@Kiran Извините, я намеревался использовать 'String # equalsIgnoreCase()'. –

0

Если есть только ограниченный набор этих элементов, я бы написал их как enum.

A name для вывода текста и ordinal для сортировки. Это чище.

0

Создать постоянную карту < Payee, Integer > и в компараторе использовать значение.

0

Другое предложение, если «Прочие услуги» всегда присутствуют, удалите его из списка, выполните сортировку, а затем добавьте «Другие услуги» последним. Таким образом, вы можете сохранить логику сортировки простой и добавить исключение отдельно.

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

0

Если список строк фиксирован, порядок основан на бизнес-логике вместо строкового значения, то я рекомендую использовать коллекции EnumMap.

enum Industry{ 
    FINANCE, GOVERNMENT, UTILITIES, TRANSPORT, OTHER 
} 

public class StreamEnumMap { 
    public static void main(String... strings){ 
     Map<Industry, String> industryMap = new EnumMap<>(Industry.class); 
     industryMap.put(Industry.FINANCE, "Financial and Insurance services"); 
     industryMap.put(Industry.GOVERNMENT,"Government Sectors"); 
     industryMap.put(Industry.UTILITIES,"Telecommunications and Utilities"); 
     industryMap.put(Industry.OTHER,"Other Services"); 
     industryMap.put(Industry.TRANSPORT, "Transportation Services"); 

     industryMap.values().stream().forEach(System.out::println); 
    } 
} 

Это дает результаты в указанном ниже порядке,

Financial and Insurance services 
Government Sectors 
Telecommunications and Utilities 
Transportation Services 
Other Services 
+0

Идея хорошая, но я получаю эти значения из DB.So Я не уверен, сколько добавлено в будущем – Kiran

+0

@kiran Если в базе данных можно добавить столбец приоритета, вы можете использовать оба этих столбца для сортировки. Лично я предпочел бы числовую сортировку по сравнению со сортировкой по строкам. Дальнейшее использование столбца приоритета переместит логику сортировки в БД. Таким образом, если в будущем вам придется изменить порядок, тогда будет проще – Sekar