按对象排序的arraylist

时间:2011-05-24 09:13:05

标签: 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对象将是参与者ID和参与者ID * AL的所有AccountProductCode对象。如果ParticipID和* AL存在产品代码,请排除* AL的产品代码。该列表应按产品代码值排序。

由于 维诺德

4 个答案:

答案 0 :(得分:2)

我只是用过滤后的数据写一个新的arraylist:

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") && apcodes.contains(apcode)) {
     // skip duplicates
     continue;
  } else {
     apcodes.add(apcode);
     filtered.add(code);
  }
}

已过滤的列表没有重复项(根据您的自定义规则)。

答案 1 :(得分: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());
    }
});

答案 2 :(得分:1)

另一种可能的解决方案是在您的对象AccountProductCode中添加compareTo方法,因此当您尝试排序时,它将使用compareTo,您可以在需要时添加一些逻辑。

答案 3 :(得分:0)

您应该使用Set。如果您不愿意使用套装:

  1. APCODE排序。
  2. 遍历列表,查看每个APCODE并过滤不需要的项目。
  3. 如果需要,请按APPART排序。