上下文:
我有一个要排序的楼层列表,以显示在android的回收器视图中:
现有楼层的示例:
+ 1º
+ 2º
R/C
R/C
"" -> Empty string because there is no information about it
目标: 我需要以 desc 和 asc 的方式对地板进行排序。
代码: 这是我的代码,问题是像上面看到的那样,在楼层上有字母和空字符串,并且我无法在字母和空字符串中执行Integer.parseInt(给出NumberFormatException)。我正在执行此转换,因为我认为我需要按顺序将变量传递给Int。我想我不能这样做,因为地板上可能包含字母,就像您在示例中看到的那样。
Collections.sort(listUAs, new Comparator<ModelUA>() {
@Override
public int compare(ModelUA lhs, ModelUA rhs) {
// -1 - less than, 1 - greater than, 0 - equal, all inversed for descending
int floorLhs = Integer.parseInt(lhs.getFloor().replaceAll("[^\\d]", ""));
int floorIntRhs = Integer.parseInt(rhs.getFloor().replaceAll("[^\\d]", ""));
return Integer.compare(floorIntRhs, floorLhs);
}
});
有人可以为您提供更好的解决方案吗?
答案 0 :(得分:1)
只需按字典顺序比较字符串即可。除非您的案件更为复杂,否则通常就足够了。
这很冗长,但是应该演示该怎么做。其中大部分只是为了举例说明。向下滚动到呼叫models.sort
,以获取所需内容。
package mandelbrot_redo.seesaw_main;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
public class ModelUA {
private String floor;
public ModelUA(String floor) {
this.floor = floor;
}
public String getFloor() {
return this.floor;
}
public static void main(String[] args) {
// Unsorted floor strings
List<String> floorStrs =
Arrays.asList("R/C",
"+ 1º",
"R/C",
"+ 2º",
"");
// Wrap each floor string in a ModelUA
List<ModelUA> models = floorStrs.stream().map(ModelUA::new).collect(Collectors.toList());
models.sort(new Comparator<ModelUA>() {
@Override
public int compare(ModelUA m1, ModelUA m2) {
// Just delegate to the string compare method
return m1.getFloor().compareTo(m2.getFloor());
}
});
for (ModelUA m : models) {
System.out.println(m.getFloor());
}
}
}
此打印:
+ 1º
+ 2º
R/C
R/C
要颠倒排序顺序,您只需在compareTo
行中交换模型:
m2.getFloor().compareTo(m1.getFloor());