如何在Java中基于两个符号转换/排序字符串?
我有以下字符串:如何在Java中基于两个符号转换/排序字符串?,java,string,sorting,java-8,Java,String,Sorting,Java 8,我有以下字符串: String string = "bbb,aaa,ccc\n222,111,333\nyyy,xxx,zzz"; 我试图将其转换为: String converted = "aaa,bbb,ccc\n111,222,333\nxxx,yyy,zzz"; 以某种方式被分类。这就是我迄今为止所尝试的: String[] parts = string.split("\\n"); List<String[]> list = new ArrayList<>()
String string = "bbb,aaa,ccc\n222,111,333\nyyy,xxx,zzz";
我试图将其转换为:
String converted = "aaa,bbb,ccc\n111,222,333\nxxx,yyy,zzz";
以某种方式被分类。这就是我迄今为止所尝试的:
String[] parts = string.split("\\n");
List<String[]> list = new ArrayList<>();
for(String part : parts) {
list.add(part.split(","));
}
for(int i = 0, j = i + 1, k = j + 1; i < list.size(); i++) {
String[] part = list.get(i);
System.out.println(part[i]);
}
String[]parts=String.split(\\n”);
列表=新的ArrayList();
用于(字符串部分:部分){
列表.添加(部分拆分(“,”);
}
对于(inti=0,j=i+1,k=j+1;i
所以我设法分别从每个“单元”中获取第一个元素。但是如何得到所有的并订购它们,这样我才能得到结果呢
使用Java8能更简单吗
提前谢谢 我想一种方法是:
String result = Arrays.stream(string.split("\\n"))
.map(s -> {
String[] tokens = s.split(",");
Arrays.sort(tokens);
return String.join(",", tokens);
})
.collect(Collectors.joining("\\n"));
System.out.println(result); // aaa,bbb,ccc\n111,222,333\nxxx,yyy,zzz
请注意,如果您的模式比\n
或,
-将这些模式提取为单独的模式是一个好主意您可以使用老式方式而不必使用Java 8,如下所示:
public static void main(String[] args) {
String s = "bbb,aaa,ccc\n222,111,333\nyyy,xxx,zzz";
System.out.println(sortPerLine(s));
}
public static String sortPerLine(String lineSeparatedString) {
// first thing is to split the String by the line separator
String[] lines = lineSeparatedString.split("\n");
// create a StringBuilder that builds up the sorted String
StringBuilder sb = new StringBuilder();
// then for every resulting part
for (int i = 0; i < lines.length; i++) {
// split the part by comma and store it in a List<String>
String[] l = lines[i].split(",");
// sort the array
Arrays.sort(l);
// add the sorted values to the result String
for (int j = 0; j < l.length; j++) {
// append the value to the StringBuilder
sb.append(l[j]);
// append commas after every part but the last one
if (j < l.length - 1) {
sb.append(", ");
}
}
// append the line separator for every part but the last
if (i < lines.length - 1) {
sb.append("\n");
}
}
return sb.toString();
}
publicstaticvoidmain(字符串[]args){
字符串s=“bbb,aaa,ccc\n222111333\nyy,xxx,zzz”;
系统输出打印LN(分拣线);
}
公共静态字符串sortPerLine(字符串行分隔字符串){
//第一件事是用行分隔符分割字符串
String[]line=lineSeparatedString.split(“\n”);
//创建用于构建排序字符串的StringBuilder
StringBuilder sb=新的StringBuilder();
//然后对于每个结果部分
对于(int i=0;i
但是,在我看来,Java 8应该是首选的,所以请坚持使用其他答案。模式
类为您提供了一种直接对字符串进行拆分的可能性
String string = "bbb,aaa,ccc\n222,111,333\nyyy,xxx,zzz";
Pattern commaPattern = Pattern.compile(",");
String sorted = Pattern.compile("\n").splitAsStream(string)
.map(elem -> commaPattern.splitAsStream(elem).sorted().collect(Collectors.joining(",")))
.collect(Collectors.joining("\n"));
在您的第二个循环中,这些
j
和k
变量的用途是什么?@Holger,Innocent copy paste Lefts:)这是正确的答案,因为收集器。正在加入(“\\n”)
。我不明白否决票是什么:(有我的+1。@Nikolas作为旁注:你不必不加评论地关心落选票,我很久以前就停下来关心那些人了。谢谢Eugen,现在也投了赞成票。我不知道为什么我在这里得到了这么多的落选票,我知道你的答案就是我想要的。@Holger我用你的建议将答案调整为纯Pattern.compile
时,你破坏了准备Pattern
的好处,你可以在String
上使用等价的方法,它可以在引擎盖下调用Pattern.compile
。在这个特定的例子中,String.split
将更加高效,因为它自己处理没有特殊意义的单字符模式,而不需要整个正则表达式机制(并且输入字符串相当短)@Holger您在准备模式方面是对的。您可以创建一个常量。但是,在不知道实际实现的情况下,我会假设拆分和流式处理的内存效率较低。撇开字符串的未记录优化不谈,最好假设在一个时间段内会有许多元素在流式处理之前创建的数组需要比其他方法更多的内存。因此,对于具有未知输入的生产代码,或者当您链接短路操作时,Pattern.splitAsStream
确实是更好的选择。中性化。但是一个一般性的建议是,解释您共享的代码块的内容和原因更有意义作为回答。
String string = "bbb,aaa,ccc\n222,111,333\nyyy,xxx,zzz";
Pattern commaPattern = Pattern.compile(",");
String sorted = Pattern.compile("\n").splitAsStream(string)
.map(elem -> commaPattern.splitAsStream(elem).sorted().collect(Collectors.joining(",")))
.collect(Collectors.joining("\n"));