繁体   English   中英

根据长度升序对字符串数组进行排序

[英]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]

tl;博士

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 ) );

请参阅在 IdeOne.com 上实时运行的代码

[a1,b2,c,d4]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM