【问题标题】:Java sort string array using Array.sort() like python's sorted with key=lambda x:Java 使用 Array.sort() 对字符串数组进行排序,类似于 python 的 key=lambda x 排序:
【发布时间】:2020-08-23 15:02:59
【问题描述】:

我偶尔会学习 Java。作为一个python背景的人,我想知道java中是否存在类似sorted(iterable, key=function)的python之类的东西。

例如,在python中我可以对一个按元素的特定字符排序的列表进行排序,例如

>>> a_list = ['bob', 'kate', 'jaguar', 'mazda', 'honda', 'civic', 'grasshopper']
>>> s=sorted(a_list) # sort all elements in ascending order first
>>> s
['bob', 'civic', 'grasshopper', 'honda', 'jaguar', 'kate', 'mazda'] 
>>> sorted(s, key=lambda x: x[1]) # sort by the second character of each element
['jaguar', 'kate', 'mazda', 'civic', 'bob', 'honda', 'grasshopper'] 

所以a_list首先按升序排序,然后按每个元素的第一个索引(第二个)字符。

我的问题是,如果我想在 Java 中按特定字符按升序对元素进行排序,我该如何实现?

下面是我写的Java代码:

import java.util.Arrays;

public class sort_list {
  public static void main(String[] args)
  {
    String [] a_list = {"bob", "kate", "jaguar", "mazda", "honda", "civic", "grasshopper"};
    Arrays.sort(a_list);
    System.out.println(Arrays.toString(a_list));}
  }
}

结果是这样的:

[bob, civic, grasshopper, honda, jaguar, kate, mazda] 

这里我只实现了数组升序排序。我希望java数组和python列表结果一样。

Java 对我来说是新手,所以任何建议都将受到高度赞赏。

提前谢谢你。

【问题讨论】:

    标签: java python arrays sorting


    【解决方案1】:

    使用自定义比较器比较两个字符串。

    Arrays.sort(a_list, Comparator.comparing(s -> s.charAt(1)));
    

    这通过字符串的第二个字符比较两个字符串。

    这将导致

    [kate, jaguar, mazda, civic, bob, honda, grasshopper]
    

    我看到 jaguarkate 在您的输出中切换。我不确定 Python 如何订购两个相等的字符串。 Arrays.sort 进行稳定排序。

    保证这种排序是稳定的:相等的元素将 不会因为排序而重新排序。

    【讨论】:

    • 这不是等价的。在 Python 中,sorted 返回一个新列表并保持原始列表不变,而 Arrays.sort() 是原位的。 OP 不使用sort,而是使用sorted,这是一个重要的区别。
    • 然后在调用 sort 之前复制原始列表或使用 Stream Arrays.stream(a_list) .sorted(Comparator.comparing(s -> s.charAt(1))) .toArray(String[]::new)
    • Python 的排序也很稳定。 jaguarkate 之前得到,因为 j 小于 k
    【解决方案2】:

    您可以使用Comparator.comparing对列表进行排序

    Arrays.sort(a_list, Comparator.comparing(e -> e.charAt(1)));
    

    如果您想使用 Java Stream API 在新列表中进行排序和收集

    String [] listSorted =  Arrays.stream(a_list)
                                  .sorted(Comparator.comparing(s -> s.charAt(1)))
                                  .toArray(String[]::new);
    

    【讨论】:

      【解决方案3】:

      您可以向Arrays.sort 提供一个 lambda 函数。对于您的示例,您可以使用:

      Arrays.sort(a_list, (String a, String b) -> a.charAt(1) - b.charAt(1));
      

      假设您首先按字母顺序对数组进行了排序(使用Arrays.sort(a_list)),这将为您提供所需的结果:

      ['jaguar', 'kate', 'mazda', 'civic', 'bob', 'honda', 'grasshopper'] 
      

      【讨论】:

        猜你喜欢
        • 2013-08-31
        • 1970-01-01
        • 2021-03-21
        • 1970-01-01
        • 2018-09-22
        • 2017-06-07
        • 1970-01-01
        • 2020-11-16
        • 2013-05-08
        相关资源
        最近更新 更多