[英]Sort a list of strings in java in alphabetical order
我有一個包含這種格式的一些字符串的列表:
List<String> ids = new ArrayList<>();
ids.add("B-7");
ids.add("B-5");
ids.add("A-3");
ids.add("B-8");
ids.add("B-1");
ids.add("B-6");
ids.add("B-2");
ids.add("B-3");
ids.add("B-10");
ids.add("A-1");
ids.add("B-4");
ids.add("B-9");
ids.add("A-2");
我需要對它進行排序以獲得這個 output,(遍歷列表):
A-1
A-2
A-3
B-1
B-2
B-3
B-4
B-5
B-6
B-7
B-8
B-9
B-10
我在用:
List<String> sortedIds = ids.stream().sorted().collect(Collectors.toList());
但相反,我的 output:
A-1
A-2
A-3
B-1
B-10 -- Error
B-2
B-3
B-4
B-5
B-6
B-7
B-8
B-9
您可以使用Comparator.comparing
和Comparator.thenComparing
Comparator
List<String> sortedIds = ids.stream().sorted(
Comparator.comparing((String s) -> s.substring(0, s.indexOf('-')))
.thenComparingInt(s -> Integer.parseInt(s.substring(s.indexOf('-') + 1))))
.collect(Collectors.toList());
默認的Comparator
將按字典順序運行。 您需要分別比較 String 部分和 Integer 部分。 就像是
Collections.sort(ids, (a, b) -> {
String[] at = a.split("-");
String[] bt = b.split("-");
int c = at[0].compareTo(bt[0]);
if (c != 0) {
return c;
}
return Integer.valueOf(Integer.parseInt(at[1])).compareTo(Integer.parseInt(bt[1]));
});
您需要在sorted()
中間操作中使用客戶Comparator<String>
List<String> sorted = ids.stream().sorted((o1, o2) -> {
String[] first = o1.split("-");
String[] second = o2.split("-");
int lettersComparison = first[0].compareTo(second[0]);
if (lettersComparison != 0) {
return lettersComparison;
}
Integer firstNumber = Integer.valueOf(first[1]);
Integer secondNumber = Integer.valueOf(second[1]);
return firstNumber.compareTo(secondNumber);
}).toList();
哪個輸出
[A-1, A-2, A-3, B-1, B-2, B-3, B-4, B-5, B-6, B-7, B-8, B-9, B-10]
也就是說,如果您只想對現有的List
進行排序,我建議不要通過Stream
對 go 進行排序,因為它在性能和創建新 ZA8CFDE6331BD59EB2AC966F8911C4B 方面有開銷。
您可以使用list.sort(comparator)
並使用與上述相同的Comparator<String>
ids.sort((o1, o2) -> {
String[] first = o1.split("-");
String[] second = o2.split("-");
int lettersComparison = first[0].compareTo(second[0]);
if (lettersComparison != 0) {
return lettersComparison;
}
Integer firstNumber = Integer.valueOf(first[1]);
Integer secondNumber = Integer.valueOf(second[1]);
return firstNumber.compareTo(secondNumber);
});
嘗試這個。
List<String> ids = Arrays.asList(
"B-7", "B-5", "A-3", "B-8", "B-1", "B-6", "B-2",
"B-3", "B-10", "A-1", "B-4", "B-9", "A-2");
Collections.sort(ids,
Comparator.comparingInt(String::length)
.thenComparing(Function.identity()));
System.out.println(ids);
output
[A-1, A-2, A-3, B-1, B-2, B-3, B-4, B-5, B-6, B-7, B-8, B-9, B-10]
這是另一種方式。 我傾向於先拆分,然后在排序后粘合在一起,而不是在比較器中不斷拆分。
List<String> result = ids.stream().map(s -> s.split("-"))
.sorted(Comparator.comparing((String[] a) -> a[0])
.thenComparingInt(
a -> Integer.parseInt(a[1])))
.map(a -> String.join(",", a))
.collect(Collectors.toList());
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.