你如何排序编号的行? Java的

时间:2016-09-25 03:07:11

标签: java sorting

我正在尝试按数字排序(例如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); }

3 个答案:

答案 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);
}