排序列表 <> 未按预期工作
Sort List<> not working as expected
如何在 java a-z 中或按 日期 或 [=24 中的任何内容排序 List<>
=]大到低或低到大等等?
我对此进行了很多搜索,发现 Collections
到 仅从 a-z 排序,但它是先排序大写字母再排序小写字母
例如:
// Must be like this
Best
best
Book
Bus
// But it's returns this
Best
Book
Bus
best
它也很慢,我看到其他应用程序在 5 秒内加载排序列表。而我的需要 15 或 20 秒!
代码:
Collections.sort(posts, new Comparator<Post>() {
@Override
public int compare(Post lhs, Post rhs) {
return lhs.getName().compareTo(rhs.getName());
}
});
使用String.toLowerCase()
来处理您的单词大写问题:
Collections.sort(posts, new Comparator<Post>() {
@Override
public int compare(Post lhs, Post rhs) {
String left = lhs.getName().toLowerCase();
String right = rhs.getName().toLowerCase();
if (left.equals(right)) {
return lhs.getName().compareTo(rhs.getName());
}
else {
return left.compareTo(right);
}
});
如果您还想在排序中包括大小和日期等内容,您可以修改 compare()
方法以将这些内容考虑在内。例如,要按名称(第一)和大小(第二)进行比较,请使用此代码:
Collections.sort(posts, new Comparator<Post>() {
@Override
public int compare(Post lhs, Post rhs) {
int nameComp = lhs.getName().compareToIgnoreCase(rhs.getName());
if (nameComp == 0) {
Integer lhsSize = lhs.getSize();
Integer rhsSize = rhs.getSize();
return lhsSize.compareTo(rhsSize);
}
else {
return nameComp;
}
}
});
使用 String.compareToIgnoreCase
可能会更有效率:
Collections.sort(posts, new Comparator<Post>() {
@Override
public int compare(Post lhs, Post rhs) {
return lhs.getName().compareToIgnoreCase(rhs.getName());
}
});
这样你就不会创建中间字符串(就像@TimBiegeleisen 的回答),而是就地比较它们。
请注意,在 Java-8 中要简单得多:
Collections.sort(posts, Comparator.comparing(Post::getName, String.CASE_INSENSITIVE_ORDER));
现有答案的补充。
"first convert to lowercase then compare" 进行忽略大小写比较的方法无效,因为不必要地创建了新的 String
对象。
更合适的方法是使用String.compareIgnoreCase()
或String.CASE_INSENSITIVE_ORDER
比较器。
而且,如果 OP 对第 3 方库开放,如果您要比较多个属性,例如使用 Guava,使用 Guava 或 Apache Common Langs 可能会使您的代码更易于阅读:
Collections.sort(posts, new Comparator<Post>() {
@Override
public int compare(Post lhs, Post rhs) {
return ComparatorChain.start()
.compare(lhs.getName(), rhs.getName(), String.CASE_INSENSITIVE_ORDER)
.compare(lhs.getName(), rhs.getName())
.compare(lhs.getDate(), rhs.getDate())
.compare(lhs.getId(), rhs.getId())
.result();
}
});
如何在 java a-z 中或按 日期 或 [=24 中的任何内容排序 List<>
=]大到低或低到大等等?
我对此进行了很多搜索,发现 Collections
到 仅从 a-z 排序,但它是先排序大写字母再排序小写字母
例如:
// Must be like this
Best
best
Book
Bus
// But it's returns this
Best
Book
Bus
best
它也很慢,我看到其他应用程序在 5 秒内加载排序列表。而我的需要 15 或 20 秒!
代码:
Collections.sort(posts, new Comparator<Post>() {
@Override
public int compare(Post lhs, Post rhs) {
return lhs.getName().compareTo(rhs.getName());
}
});
使用String.toLowerCase()
来处理您的单词大写问题:
Collections.sort(posts, new Comparator<Post>() {
@Override
public int compare(Post lhs, Post rhs) {
String left = lhs.getName().toLowerCase();
String right = rhs.getName().toLowerCase();
if (left.equals(right)) {
return lhs.getName().compareTo(rhs.getName());
}
else {
return left.compareTo(right);
}
});
如果您还想在排序中包括大小和日期等内容,您可以修改 compare()
方法以将这些内容考虑在内。例如,要按名称(第一)和大小(第二)进行比较,请使用此代码:
Collections.sort(posts, new Comparator<Post>() {
@Override
public int compare(Post lhs, Post rhs) {
int nameComp = lhs.getName().compareToIgnoreCase(rhs.getName());
if (nameComp == 0) {
Integer lhsSize = lhs.getSize();
Integer rhsSize = rhs.getSize();
return lhsSize.compareTo(rhsSize);
}
else {
return nameComp;
}
}
});
使用 String.compareToIgnoreCase
可能会更有效率:
Collections.sort(posts, new Comparator<Post>() {
@Override
public int compare(Post lhs, Post rhs) {
return lhs.getName().compareToIgnoreCase(rhs.getName());
}
});
这样你就不会创建中间字符串(就像@TimBiegeleisen 的回答),而是就地比较它们。
请注意,在 Java-8 中要简单得多:
Collections.sort(posts, Comparator.comparing(Post::getName, String.CASE_INSENSITIVE_ORDER));
现有答案的补充。
"first convert to lowercase then compare" 进行忽略大小写比较的方法无效,因为不必要地创建了新的 String
对象。
更合适的方法是使用String.compareIgnoreCase()
或String.CASE_INSENSITIVE_ORDER
比较器。
而且,如果 OP 对第 3 方库开放,如果您要比较多个属性,例如使用 Guava,使用 Guava 或 Apache Common Langs 可能会使您的代码更易于阅读:
Collections.sort(posts, new Comparator<Post>() {
@Override
public int compare(Post lhs, Post rhs) {
return ComparatorChain.start()
.compare(lhs.getName(), rhs.getName(), String.CASE_INSENSITIVE_ORDER)
.compare(lhs.getName(), rhs.getName())
.compare(lhs.getDate(), rhs.getDate())
.compare(lhs.getId(), rhs.getId())
.result();
}
});