当前位置: 首页 > 知识库问答 >
问题:

Java排序字符串2列出并比较它们

甘骞尧
2023-03-14

我想排序2列表并比较它们,但排序方法不起作用。我有2个字符串列表,其中包括整数。

这些是我的名单

List<String> WORD_OF_ADDRESS = gatekeeperPage.getWords(ADDRESS);
List<String> WORD_OF_CONTACT_ADDRESS = gatekeeperPage.getWords(CONTACT_ADDRESS);

我的getwords方法返回:返回数组。asList(文字)

当我尝试这个的时候;

Stream<Object> sortedList = Arrays.stream(WORD_OF_ADDRESS.toArray()).sorted();
System.out.println("SORTED LİST "+ sortedList);

我明白了:<代码>排序的LİST java。util。流动分拣机$OfRef@3e8c3cb

我应该如何对2列表排序?


共有2个答案

赫连俊悟
2023-03-14

您可以按如下方式轻松对列表进行排序:

List<String> WORD_OF_ADDRESS_sorted gatekeeperPage.getWords(ADDRESS)
    .stream().sorted().toList();
List<String> WORD_OF_CONTACT_ADDRESS_sorted = gatekeeperPage.getWords(CONTACT_ADDRESS)
    .stream().sorted().toList();

然后你可以比较它们。

但是,如果您只想查看它们是否基于内容相等,则不需要排序来测试内容相等。每次项目出现时使用运行计数更新映射更有效<代码>一个列表加1,另一个列表减去1<代码>贴图。“合并”(merge)很有用,因为它允许用空值替换值,然后删除条目。因此,如果最终得到一个空映射,则列表必须基于内容相等。

public static <T> boolean areEqual(List<T> list1, List<T> list2) {
    Map<T, Integer> map = new HashMap<>();
    if (list1.size() != list2.size()) {
        return false;
    }
    
    for (int i = 0; i < list1.size(); i++) {
        map.merge(list1.get(i), -1,
                (k, v) -> v + 1 == 0 ? null : v + 1);
        map.merge(list2.get(i), 1,
                (k, v) -> v - 1 == 0 ? null : v - 1);
    }
    
    return map.isEmpty();
}

我没有广泛地测试过这个,但是所有的测试都使用随机整数列表,其中只有一个被复制,洗牌测试为相等。随机加盐测试为假的不同值的列表。

由于不可变列表不会更改,因此可以将其直接传递给方法。

警告:由于整数有一个最大值和一个最小值,如果达到这些限制,非常大的列表有可能失败。计算长整数或大整数将缓解此问题,但也会降低其性能。

山越
2023-03-14

您实际显示的是一个Stream。但您想要的是此流使用的字符串列表,请这样更改您的代码:

List<String> sortedList = WORD_OF_ADDRESS.stream()
                         .sorted()
                         .collect(Collectors.toList());

然后像强尼·莫普那样展示你的清单

 类似资料:
  • 我有字符串数组:15MB、12MB、1TB、1GB。我想通过遵循MB小于GB和TB的规则来对它们进行词典比较。所以最后我想得到:12MB,15MB,1GB,1TB。我找到了一个比较字母的方法: 我在考虑用数字和字母拆分字符串,但我如何用字母“MB”对它们进行排序。然后根据他们的数字。我是使用两个比较器还是其他什么?

  • 主要内容:equals() 方法,equalsIgnoreCase() 方法,equals()与==的比较,compareTo() 方法字符串比较是常见的操作,包括比较相等、比较大小、比较前缀和后缀串等。 在 Java 中,比较字符串的常用方法有 3 个:equals() 方法、equalsIgnoreCase() 方法、 compareTo() 方法。下面详细介绍这 3 个方法的使用。 equals() 方法 equals() 方法将逐个地比较两个字符串的每个字符是否相同。如果两个字符串具有相

  • 我有一个java程序,它可以构建一个最大堆,调用Heapify并对任何列表进行排序。目前,它将对字母表进行排序,不会出现任何问题,甚至还会列出一系列字符串,如apple、addle、azzle,也不会出现任何问题。下面是程序输入的屏幕截图,其中显示了第一行要排序的项目数及其下面的列表: 绿色是我知道已经正确排序的输入。如果检查unicode表,可以看到绿色列表的排序正确。但是,我的程序输出不正确(

  • 问题内容: 我是Java的新手:) 我有2个字符串列表,我想知道比较这两者的最有效方法是什么,并得到一个包含另一个字符串的结果数组。例如,我有一个名为oldStrings的列表和一个名为Strings的列表。我已经看过Comparator函数,但是还不完全了解它的工作原理,现在我想我可以创建一个for循环,遍历每个字符串,然后保存该字符串: 此列表中最多包含200个字符串。这是解决此问题的最佳方法

  • 问题内容: 我写了一个从套接字读取一行的代码。 如果该行是“再见”,我希望它输出“ nice”。由于某种原因它不起作用,尽管我确实尝试无条件输出输入,并且确实说“再见” 这是我的代码 问题答案: 使用,而不是比较字符串。

  • 问题内容: 给我输出: 我不太了解第一行,为什么它会给我带来错误? 如果我在字符串2上添加空格,则此行为false,但如果不添加空格,则为true: 为什么第1行给我假,但第6行为真,但是如果我在string2上添加空格则为假。 谢谢=) 问题答案: 那里发生了几件事。 当您将两个字符串声明为相等的“ Hi”时,java将对其进行优化以引用相同的字符串对象(因此不必将相同的字符串存储两次)。 “