[英]Sort an array of strings based on length in ascending order
问题是按照字符串的长度升序打印字符串数组。
例如
input={"vellore","i","from","am"}
output=i am from vellore
这是我的代码:
int n=sc.nextInt();
sc.nextLine();
String[] arr = new String[n];
for(int i=0;i<n;i++){
arr[i]=sc.nextLine();
}
//System.out.println(Arrays.toString(arr));
Arrays.sort(arr);
for(String i: arr){
System.out.print(i+" ");
}
现在我知道我的 output 将以“我来自我维洛尔”的词汇顺序出现,但我想使用排序方法获得我想要的 output。 我尝试使用 Collections.sort() 以及使用 arraylist 但我仍然没有得到我想要的 output。
我想通过比较字符串和所有的长度来使用排序方法而不使用常规方法来获取我的 output。
你想要一个Comparator
。 在这种情况下,您特别希望从比较String
长度开始。 我建议你然后自然地比较(打破关系)。 喜欢,
String[] arr = { "vellore", "i", "from", "am" };
Arrays.sort(arr, Comparator.comparingInt(String::length)
.thenComparing(Comparator.naturalOrder()));
System.out.println(Arrays.toString(arr));
输出(按要求)
[i, am, from, vellore]
Comparator
.comparingLong( ( String s ) -> s.codePoints().count() )
.thenComparing( Comparator.naturalOrder() )
char
Frisch 的答案在建议使用Comparator
时是正确的。 但是,那里看到的方法参考String::length
对大多数字符都失败了。 请参阅此示例。 String#length
方法将两个字符的字符串(如c
)错误地报告为三个。
失败是因为该方法依赖于自 Java 2 以来一直存在的char
。作为 16 位值, char
类型在物理上无法表示 Unicode 中定义的超过 140,000 个字符中的大部分。
相反,使用 Unicode 代码点整数。
切换出该方法参考以使用代码点而不是char
类型。
这里我们使用String#codePoints
来生成一个IntStream
。 该IntStream
是每个字符的代码点编号的 stream,其值在零到略超过一百万的范围内。 然后我们使用IntStream#count
来获取 stream 中的值的计数,即原始字符串中字符的计数。
String[] arr = { "a1", "c🕒", "b2", "d4" };
Arrays
.sort(
arr ,
Comparator
.comparingLong( ( String s ) -> s.codePoints().count() )
.thenComparing( Comparator.naturalOrder() )
);
System.out.println( Arrays.toString( arr ) );
[a1,b2,c,d4]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.