Android / Java如何在ArrayList中有效地使用多个比较器

时间:2014-06-17 13:17:46

标签: java android sorting arraylist

我有一个名为Java

Friend
public class Friend {   
    public String friendsUserName;
    public boolean isFavorite;
    public boolean isFriend;
}

我从包含此类Json的{​​{1}}的服务器获取JsonArray个文件。我使用Friend类来解析并将Gson映射到Json。我必须按照以下方式对数组进行排序

  1. 顶级元素ArrayList<Friend> FriendisFavorite
  2. 然后isFriend包含仅ArrayList
  3. 的剩余Friend
  4. 最后,isFriend包含ArrayList,其中FriendisFriend
  5. 因此,我可以使用此ComparatorChain

    中描述的方法

    或者我可以使用以下方法对False

    进行正确排序
    ArrayList<Friend>

    public ArrayList<Friend> friendsList; public void sortArrayList() { ArrayList<Friend> favoriteList = new ArrayList<Friend>(); ArrayList<Friend> friendOnlyList = new ArrayList<Friend>(); ArrayList<Friend> nonFriendList = new ArrayList<Friend>(); for (int length = friendsList.size(), i = length - 1; i >= 0; i--) { Friend friend = friendsList.get(i); if (friend.isFriend) { if (friend.isFavorite) { favoriteList.add(friend); } else { friendOnlyList.add(friend); } } else { nonFriendList.add(friend); } friendsList.remove(i); } addAllAndClear(favoriteList); favoriteList = null; addAllAndClear(friendOnlyList); friendOnlyList = null; addAllAndClear(nonFriendList); nonFriendList = null; } public void addAllAndClear(ArrayList<Friend> updatedList) { Collections.sort(updatedList, nameComparator); friendsList.addAll(updatedList); updatedList.clear(); updatedList = null; } Comparator<Friend> nameComparator = new Comparator<FriendListResponse.Friend>() { @Override public int compare(Friend lhs, Friend rhs) { return lhs.friendsUserName.compareTo(rhs.friendsUserName); }; }; 明智的我应该遵循Efficiency或我自己的方法。我正在为ComparatorChain平台开发此内容,因此AndroidMemory Management是最重要的。   附:我不擅长使用工具来比较Efficiency

2 个答案:

答案 0 :(得分:2)

在班级朋友中实施可比较界面,然后使用 Collections.sort()

或者@vipul mittal建议

比较者可能看起来像

Comparator<Friend> favoriteComparator = new Comparator<FriendListResponse.Friend>() {
    @Override
    public int compare(Friend lhs, Friend rhs) {
        int i=0,j=0;
        if(lhs.isFavorite() && lhs.isFriend())
           i++;
        if(lhs.isFriend())
           i++;
        if(rhs.isFavorite() && rhs.isFriend())
           j++;
        if(rhs.isFriend())
           j++; 

        if (i==j) {
            return lhs.friendsUserName.compareTo(rhs.friendsUserName);
        }
        else {
            return i-j;
        }
    };
};

答案 1 :(得分:2)

尝试使用以下比较器:

Comparator<Friend> favoriteComparator = new Comparator<FriendListResponse.Friend>() {
    @Override
    public int compare(Friend lhs, Friend rhs) {
        int i=0,j=0;
        if(lhs.isFavorite()&&lhs.isFriend())
           i++;
        if(lhs.isFriend())
           i++;
        if(rhs.isFavorite()&&rhs.isFriend())
           j++;
        if(rhs.isFriend())
           j++; 
        return i-j;
    };
};

排序时:

Collections.sort(friendsList,favoriteComparator);