Сортировать список массивов, содержащий объект

#java

#java

Вопрос:

у меня есть ArrayList содержащий объект, названный как AccountProductCode , у него есть три параметра, которые похожи, например, на

   AccountProductCode accprocode = new AccountProductCode(); 
  accprocode.setAPPART("002");
  accprocode.setAPCODE("PC1");
  finalList.add(accprocode);
  

итак, здесь предположим, что список содержит такие данные, как

 APPART APCODE
001     PC1
002     PC2
003     PC3
004     PC4
*AL     PC1
  

мне нужно отсортировать данные, например, если они APART *AL имеют то же самое APCODE , что и другие, APART тогда мне нужно исключить это APCODE . таким образом, список будет выглядеть

 APCODE
PC1
PC2
PC3
PC4
  

как я могу выполнить программу, используя ArrayList не использовать Set ..

и список должен быть отсортирован…

пожалуйста, проверьте мое новое точное утверждение….Создает и возвращает объект List, в котором все объекты AccountProductCode будут содержать participantID и идентификатор участника * AL. Если код продукта существует для participantID и *AL, исключите код продукта для *AL. Список должен быть отсортирован по значению кода продукта.

Спасибо, Винод

Комментарии:

1. Вы не сортируете, вы отфильтровываете дубликаты. Почему вы не можете использовать Set для этого? Это делает именно то, что вы хотите.

2. @Space_C0wb0y это не для дублирования, если * AL имеет тот же APAPRT, который похож на other, тогда мне нужно удалить из списка это только для * AL

3. @Пробел, вероятно, потому, что это домашнее задание, и требуется выполнить сортировку (?)

4. @Пробел проверьте мое новое описание, что я хочу

Ответ №1:

Я бы просто написал новый список массивов с отфильтрованными данными:

 List<AccountProductCode> filtered = new ArrayList<AccountProductCode>();
Set<String> apcodes = new HashSet<String>();
for (AccountProductCode code:getList()) {   // some magic to get the current list
  String apcode = code.getApCode();
  if (apcode.equals("*AL") amp;amp; apcodes.contains(apcode)) {
     // skip duplicates
     continue;
  } else {
     apcodes.add(apcode);
     filtered.add(code);
  }
}
  

Отфильтрованный список не содержит дубликатов (в соответствии с вашим пользовательским правилом).

Комментарии:

1. @vinod — ты не сказал. Это звучало как некоторый пример. — улучшенная версия ограничивает фильтрацию теми *AL записями с уже сохраненными apc-кодами.

2. @vinod — Я ухожу — вы слишком часто меняете требования, теперь вы хотите, чтобы они были отфильтрованы и отсортированы 😉 Шон уже показал вам хорошую реализацию для сортировки (отфильтрованного) массива.

Ответ №2:

Переписать: Теперь я больше не использую внешний набор или карту. Ценой за это является то, что мне приходится потенциально перебирать весь список для каждого добавления (ужасная производительность):

Добавьте элементы, подобные этому:

 public boolean addUniqueItem(List<AccountProductCode> list,
                             AccountProductCode item){
    for(AccountProductCode existingItem : list){
        if(item.getApart().equals(existingItem.getApart())return false;
    }
    return list.add(item);
}
  

Затем отсортируйте список следующим образом:

 Collections.sort(list, new Comparator<AccountProductCode>(){
    public int compare(AccountProductCode a, AccountProductCode b){
        return a.getApCode().compareTo(b.apCode());
    }
});
  

Комментарии:

1. но где ваше сравнение с * AL

2. @vinod if(!map.containsKey(item.getAppart())){ здесь

Ответ №3:

Другим возможным решением было бы в вашем объекте AccountProductCode добавить compareTo метод, поэтому при попытке сортировки он будет использовать compareTo , вы можете добавить туда некоторую логику, если это необходимо.

Ответ №4:

Вы должны использовать Set . Если вы не желаете использовать набор:

  1. Сортировать по APCODE .
  2. выполните итерацию по списку, просматривая каждый APCODE и фильтруя ненужные элементы.
  3. при желании отсортируйте по APPART .