我想按升序对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;
}
});
它不起作用。有什么建议吗?
感谢。
答案 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());
}
}
}