我正在尝试按数字排序(例如1.etc ...,2.etc ...,3.etc ...)。我尝试过SortedSet TreeSet。
SortedSet<String> s = new TreeSet<String>();
像这样输入
for (String line = r.readLine(); line != null; line = r.readLine()){
s.add(line);
}
每当我尝试输出时,我都没有得到正确的信息,我就像这样打印
for (String text : s){
w.println(text);
}
答案 0 :(得分:0)
String no = line.subString(0, line.indexOf("."));
Integer intNo = Integer.valueOf(no);
TreeMap<Integer, String> myMap = new TreeMap<Integer, String>();
myMap.put(intNo, line);
答案 1 :(得分:0)
提供合适的比较器:
Set<String> s = new TreeSet<String>(Comparator.comparing(s ->
Integer.parseInt(s.replaceAll("\\D.*", ""))));
比较器lambda首先从第一个非数字开始删除所有字符,然后将结果解析为数字,并将其交给辅助方法进行比较。
如果您不提供比较器,则使用自然排序,对于字符串是字母(字母)顺序,其中"100"
是“小于”"11"
,这是“更少”比“"2"
。
免责声明:代码可能无法编译或工作,因为它在我的手机上被翻阅(但它有可能起作用)
答案 2 :(得分:0)
您可以编程到Set
界面(无需指定SortedSet
),并确保以所需方式排序的方式是提供Comparator<String>
;一种方法是编译Pattern
并将输入与正则表达式匹配
Set<String> s = new TreeSet<>(new Comparator<String>() {
Pattern p = Pattern.compile("(\\d+)\\.(.+)");
@Override
public int compare(String o1, String o2) {
Matcher m1 = p.matcher(o1);
Matcher m2 = p.matcher(o2);
if (m1.matches() && m2.matches()) {
int a = Integer.parseInt(m1.group(1));
int b = Integer.parseInt(m2.group(1));
int r = Integer.compare(a, b);
if (r != 0) {
return r;
}
return m1.group(2).compareTo(m2.group(2));
}
return 0;
}
});
虽然您当前的方法可行,但惯用方式读取您的行会像
String line;
while ((line = r.readLine()) != null) {
s.add(line);
}