【问题标题】:How do I print a string from a word array, including its duplicates?如何打印单词数组中的字符串,包括其重复项?
【发布时间】:2019-05-03 12:17:57
【问题描述】:

我已经实现了以下代码,以尝试根据我的变量 wordToGuess 的排列对 ArrayList 进行排序,而不使用 Comparator 类。这适用于没有重复字母的字符串,如“嘶哑”。

但是,当我将 wordToGuess 更改为“恒星”时,问题就出现了。我确实意识到问题源于 indexOutOfBoundExceptionError 但我已经考虑了一整天,似乎无法找到可能的解决方案。

我的主要问题是将整个单词“stellar”转移到我的orderedHint ArrayList 中,同时保留两个'l's。

非常感谢任何帮助!如果您对如何在不使用另一个 Comparator 类的情况下对 ArrayList 进行排序有更好的建议,我肯定会从中学习!期待您的回答! :D

import java.util.ArrayList;
import java.util.List;

public class ArrayListTest {
    public static List<Character> hints = new ArrayList<Character>();
    public static List<Character>  orderedHint = new ArrayList<Character>();
    public static String wordToGuess = "hoarse";
    public static String word = "";
    public static String fullWord = "";

public static void sortHintsArray() {
    System.out.println("hints: " + hints);
    System.out.println("orderedHint: " + orderedHint);
    for(int i = 0;i<hints.size();i++)
    {

        int index = wordToGuess.indexOf(hints.get(i));
        orderedHint.set(index,hints.get(i));
        System.out.println();
        System.out.printf("%d iteration: \n",i+1);
        System.out.println("hints: " + hints);
        System.out.println("orderedHint: " + orderedHint);
    }
    for(int i =0;i<wordToGuess.length();i++)
    {
        fullWord += orderedHint.get(i);
    }

}

public static boolean checkCorrect() {

    return fullWord == word;
}

public static void main(String[] args) {
    hints.add('e');
    hints.add('r');
    hints.add('s');
    hints.add('a');
    hints.add('h');
    hints.add('o');
    orderedHint.add('e');
    orderedHint.add('r');
    orderedHint.add('s');
    orderedHint.add('a');
    orderedHint.add('h');
    orderedHint.add('o');


    sortHintsArray();
    //System.out.println(hints);
    System.out.println(fullWord);
    }
}

输出:

hints: [e, r, s, a, h, o]
orderedHint: [e, r, s, a, h, o]

1 iteration: 
hints: [e, r, s, a, h, o]
orderedHint: [e, r, s, a, h, e]

2 iteration: 
hints: [e, r, s, a, h, o]
orderedHint: [e, r, s, r, h, e]

3 iteration: 
hints: [e, r, s, a, h, o]
orderedHint: [e, r, s, r, s, e]

4 iteration: 
hints: [e, r, s, a, h, o]
orderedHint: [e, r, a, r, s, e]

5 iteration: 
hints: [e, r, s, a, h, o]
orderedHint: [h, r, a, r, s, e]

6 iteration: 
hints: [e, r, s, a, h, o]
orderedHint: [h, o, a, r, s, e]
hoarse

【问题讨论】:

  • 你为什么不使用Comparator
  • 因为我的作业不允许哈哈我需要把所有这些都放在一个班级里。
  • 当我将 wordToGuess 更改为“stellar”时 ...您如何更改相应的hints
  • 我通过将 wordToGuess 设置为“stellar”并更改 main 方法中的 hints.add 对其进行硬编码。

标签: java arraylist duplicates


【解决方案1】:

这个问题主要是因为使用了String.indexOf,它总是会返回第一个出现的索引,因此包含重复字符的字符串会失败

int index = wordToGuess.indexOf(hints.get(i));

重要提示:另一方面,当您的 hints 没有重复字符时,我可以确认这将失败。例如,这将失败

List<Character> hints = List.of('s','t','e','l','a','r');

但不是

List<Character> hints = List.of('s','t','e','l', 'l', 'a','r');

Soln:您可能想要跟踪直到您已经扫描了一封信的索引,然后使用 indexOf(int ch, int fromIndex) 或者可能想一个更好的设计。

注意:另一行代码捏我的是

fullWord += orderedHint.get(i); 

尽量避免在循环中连接字符串,计划使用StringBuilder

【讨论】:

  • 我明白了!太感谢了!您的解决方案为我提供了尝试的新可能性!请问是否可以在不使用比较器类的情况下根据另一个 ArrayList 的排列对 ArrayList 进行排序?我能够将整个 wordToGuess(包括重复项)添加到 orderedHint ArrayList 中。现在我相信我只需要比较我未安排的提示 ArrayList 和我安排的orderedHint ArrayList! @nullpointer
  • @Beelz 您不需要这样的自定义类,但您需要某种 Comparator 进行排序,您可以在其中查找alternatives in answers to this question
  • @Beelz 您不需要这样的自定义类,但您需要某种 Comparator 进行排序,您可以在其中查找alternatives in answers to this question
猜你喜欢
  • 2015-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多