Как напечатать строку из массива слов, включая его дубликаты? - PullRequest
0 голосов
/ 01 декабря 2018

Я реализовал следующий код, чтобы попытаться отсортировать ArrayList на основе расположения моей переменной wordToGuess без использования класса Comparator.Это работает для строк, которые не имеют повторяющихся букв, таких как «хриплый».

Однако проблема возникает, когда я изменяю wordToGuess на «звездный».Я понимаю, что проблема связана с indexOutOfBoundExceptionError, но я думал целый день и не могу найти вероятного решения.

Моя главная проблема заключается в перемещении целого слова "звездный" в мой заказанный ArrayList Hint, сохраняя при этом оба "я" внутри.

Любая помощь очень ценится !!Если у вас есть лучшее предложение о том, как я могу отсортировать ArrayList без использования другого класса Comparator, я определенно извлеку уроки из него!Ждем ваших ответов!: 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 голосов
/ 01 декабря 2018

Проблема в основном из-за использования 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.

...