按顺序对ArrayList排序并给出字符优先级(Java)

时间:2016-03-04 11:07:44

标签: java android arraylist comparator

我想按升序对ArrayList进行排序,但希望保留从字符开始的项目(例如:说'S')。我正在尝试使用Comparator实现这一目标。

Collections.sort(mSearchHolder.get(1).contactList, new Comparator<SearchData>() {
                @Override
                public int compare(SearchData s1, SearchData s2) {
                    int returnValue = 0;
                    if(!s1.getName().toLowerCase().startsWith(search.toLowerCase())
                            && !s2.getName().toLowerCase().startsWith(search.toLowerCase())) {
                        returnValue = s1.getName().compareToIgnoreCase(s2.getName());
                    } else if(s1.getName().toLowerCase().startsWith(search.toLowerCase())
                            && s2.getName().toLowerCase().startsWith(search.toLowerCase())) {
                        returnValue = s1.getName().compareToIgnoreCase(s2.getName());
                    } else {
                        if(s1.getName().toLowerCase().startsWith(search.toLowerCase())) {
                            returnValue = 1;
                        } else if(s2.getName().toLowerCase().startsWith(search.toLowerCase())) {
                            returnValue = -1;
                        }
                    }
                    return returnValue;
                }
            });

它不起作用。有什么建议吗?

感谢。

2 个答案:

答案 0 :(得分:0)

你只需要翻转-1和1返回案例。

如果只有s1与S匹配,那么s1在s2之前,所以返回-1。

如果只有s2与S匹配,那么s2在s1之前,所以返回1.

Collections.sort(mSearchHolder.get(1).contactList, new Comparator<SearchData>() {
                @Override
                public int compare(SearchData s1, SearchData s2) {
                    int returnValue = 0;
                    if(!s1.getName().toLowerCase().startsWith(search.toLowerCase())
                            && !s2.getName().toLowerCase().startsWith(search.toLowerCase())) {
                        returnValue = s1.getName().compareToIgnoreCase(s2.getName());
                    } else if(s1.getName().toLowerCase().startsWith(search.toLowerCase())
                            && s2.getName().toLowerCase().startsWith(search.toLowerCase())) {
                        returnValue = s1.getName().compareToIgnoreCase(s2.getName());
                    } else {
                        if(s1.getName().toLowerCase().startsWith(search.toLowerCase())) {
                            returnValue = -1;
                        } else if(s2.getName().toLowerCase().startsWith(search.toLowerCase())) {
                            returnValue = 1;
                        }
                    }
                    return returnValue;
                }
            });

答案 1 :(得分:0)

也许是这样的:

config.authorization_adapter = ActiveAdmin::Adapter

它给出了输出:

public class TestSort {

    static String search = "S";


    public static void main(String[] args) {
        List<SearchData> searchCollection = new ArrayList<SearchData>();
        searchCollection.add(new SearchData("Sting"));
        searchCollection.add(new SearchData("Maria"));
        searchCollection.add(new SearchData("Sarah"));
        searchCollection.add(new SearchData("Andrea"));
        searchCollection.add(new SearchData("Sergio"));
        searchCollection.add(new SearchData("Gustav"));

        Collections.sort(searchCollection, new Comparator<SearchData>() {

            public int compare(SearchData s1, SearchData s2) {
                String s1name = s1.getName().toLowerCase();
                String s2name = s2.getName().toLowerCase();
                String searchLower = search.toLowerCase();
                int returnValue = 0;
                if (!s1name.startsWith(searchLower)
                        && !s2name.startsWith(searchLower)) {
                    returnValue = s1name.compareTo(s2name);
                } else if (s1name.startsWith(searchLower)
                        && s2name.startsWith(searchLower)) {
                    returnValue = s1name.compareTo(s2name);
                } else {
                    if (s1name.startsWith(searchLower) && !s2name.startsWith(searchLower)) {
                        returnValue = -1;
                    } else if (!s1name.startsWith(searchLower) && s2name.startsWith(searchLower)) {
                        returnValue = 1;
                    }
                }
                return returnValue;
            }
        });

        for(SearchData s : searchCollection) {
            System.out.println(s.getName());
        }
    }
}