如何从单词数组(包括重复项)中打印字符串?

时间:2018-12-01 16:30:41

标签: java arraylist duplicates

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

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

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

任何帮助都非常感谢!!如果您对不使用另一个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

1 个答案:

答案 0 :(得分:0)

该问题主要是由于使用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