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

检查和打印字谜时的IndexOutOfBoundsException[重复]

郎健柏
2023-03-14
String[] arr = {"pear", "amleth", "dormitory", "tinsel", "dirty room", "hamlet", "listen", "silent"};
amleth, hamlet
dirty room, dormitory
public class Main {

    static void checkPrintAnagrams(String[] str){

        List<List<String>> out = new ArrayList<>();

        int[] check = new int[str.length];
        for(int i = 0; i < str.length; i++){
            List<String> list = new ArrayList<>();
            for(int j= 1; j < str.length; j++){
                if(check[j] != 1 && check[i] != 1){
                   if(isAnagram(str[i], str[j])){
                       list.add(str[i]);
                       list.add(str[j]);
                       check[j] = 1;
                       check[i] = 1;
                   }
                }
            }
            out.add(list);
        }

        Collections.sort(out, new Comparator<List<String>> () {
            @Override
            public int compare(List<String> a, List<String> b) {
                return a.get(1).compareTo(b.get(1));
            }
        });

        for(Iterator itr = out.iterator(); itr.hasNext();){
            List<String> l = (List<String>) itr.next();
            for(Iterator it = l.iterator(); it.hasNext();){
                System.out.print(it.next() + ",");
            }
            System.out.println();
        }
    }

    static boolean isAnagram(String firstWord, String secondWord) {
        char[] word1 = firstWord.replaceAll("[\\s]", "").toCharArray();
        char[] word2 = secondWord.replaceAll("[\\s]", "").toCharArray();
        Arrays.sort(word1);
        Arrays.sort(word2);
        return Arrays.equals(word1, word2);
    }


    public static void main(String[] args) {
    // write your code here
        String[] arr = {"pear", "amleth", "dormitory", "tinsel", "dirty room", "hamlet", "listen", "silent"};
        checkPrintAnagrams(arr);
    }
}

这是我的错误信息。

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 1, Size: 0
    at java.util.ArrayList.rangeCheck(ArrayList.java:653)
    at java.util.ArrayList.get(ArrayList.java:429)
    at io.soumasish.Main$1.compare(Main.java:31)
    at io.soumasish.Main$1.compare(Main.java:28)
    at java.util.TimSort.countRunAndMakeAscending(TimSort.java:355)
    at java.util.TimSort.sort(TimSort.java:220)
    at java.util.Arrays.sort(Arrays.java:1512)
    at java.util.ArrayList.sort(ArrayList.java:1454)
    at java.util.Collections.sort(Collections.java:175)
    at io.soumasish.Main.checkPrintAnagrams(Main.java:28)
    at io.soumasish.Main.main(Main.java:62)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)

希望帮助您了解集合排序部分以及如何在此上下文中正确实现它。

共有1个答案

璩正志
2023-03-14

可以使用分组按创建映射

您所需要做的就是将数据按标准化的一些进行分组:

  • 删除所有空格
  • 按字母顺序对字符排序
  • 创建字符串

简单:

Map<String, List<String>> anagrams = Stream.of(arr).collect(groupingBy(s -> {
    char[] chars = s.replaceAll("\\s", "").toCharArray();
    Arrays.sort(chars);
    return new String(chars);
}));

例如:

anagrams.forEach((k, v) -> {
    System.out.printf("Anagrams of %s - %s%n", k, v);
});
 类似资料:
  • 本文向大家介绍使用清单和字典在Python中一起打印字谜,包括了使用清单和字典在Python中一起打印字谜的使用技巧和注意事项,需要的朋友参考一下 在本教程中,我们将编写一个程序,该程序使用list和dictionary查找和打印字谜。对于每个问题,我们都有不同的方法。尝试编写代码而不遵循本教程。如果您不能产生任何想法来编写逻辑,请执行以下步骤。 算法 让我们为上述算法编写代码。 示例 输出结果

  • ...output: 线程“main”java.lang.indexoutofboundsexception:在java.base/jdk.internal.util.preconditions.outofbounds(未知源)在java.base/jdk.internal.util.preconditions.outofbounds(未知源)在java.base/jdk.internal.uti

  • 这个Java程序在试图调用组(1)时向我显示IndexOutOfBoundsExctive。如果我将替换为,那么整行将被打印...我必须做什么?

  • 报表填充过程JasperPrint objects的输出可以使用内置的查看器组件查看,或打印,或导出为更流行的文档格式,如PDF,HTML,RTF,XLS,ODT,CSV或XML。 本章将讨论查看和打印Jasper文档,下一章将讨论导出,即“导出报告”。 查看报告 JasperReport提供了一个内置的查看器,用于以原始格式查看生成的报告。 它是一个基于swing的组件,其他Java应用程序可以

  • 问题内容: 考虑以下示例代码: 初始化时的初始容量为7,然后下一行尝试将字符串“ Hello”添加到位置5。这将引发IndexOutOfBoundsException: 线程“主”中的异常java.lang.IndexOutOfBoundsException:索引:5,大小:0 我查看了有关ArrayList的“初始容量”的含义的问题。我知道这个特定的构造函数正在为7个String元素分配空间,如

  • 我有一个有点奇怪的问题。 我有一个“word”对象列表。“word”对象包含一个字符串myCWord,它等于传入word的字符串的规范版本。 规范形式是字符串中的排序字符。 现在我有了一个单词列表,在这里我可以访问它们所包含的字符串的规范版本。 我需要一个算法来创建“子列表”,这些列表包含一组单词,这些单词是每个单词的字谜。