#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
. Если вы не желаете использовать набор:
- Сортировать по
APCODE
. - выполните итерацию по списку, просматривая каждый
APCODE
и фильтруя ненужные элементы. - при желании отсортируйте по
APPART
.