Как добавить несколько символов в один индекс в массиве символов? - PullRequest
0 голосов
/ 24 сентября 2018

В настоящее время я пытаюсь создать функцию, в которой моим вводом является строка, такая как «AABBCCDDEE», и функция выводит массив строк «AA», «BB», «CC» и так далее.

    public static char[] stringSplitter(final String input) {

            String[] strarray = new String[input.length()];
            if (input == null) {
                return null;
            }
            char[] chrarray = input.toCharArray();
            char[] outputarray = new char[input.length()];
            int j = 0;
            for (int i = 0; i < chrarray.length; i++) {
                char chr = chrarray[i];
                System.out.print(chr);
                outputarray[j] = chrarray[i]; //here i need to find a way to add the characters to the index at j if the preceding characters are equal
                if (i + 1 < input.length() && chrarray[i + 1] != chr) {
                    j++;
                    outputarray[j] = chrarray[i + 1];
                    System.out.println(" ");
                }
            }
}

Ответы [ 3 ]

0 голосов
/ 24 сентября 2018

Если я правильно понял, вы хотите разделить символы в строке так, чтобы одинаково-последовательные символы оставались вместе.Если это так, вот как я бы это сделал:

public static ArrayList<String> splitString(String str) {
    ArrayList<String> output = new ArrayList<>();
    String combo = "";

    //iterates through all the characters in the input
    for(char c: str.toCharArray()) {
        //check if the current char is equal to the last added char
        if(combo.length() > 0 && c != combo.charAt(combo.length() - 1)) {
            output.add(combo);    
            combo = "";
        }

        combo += c;
    }

    output.add(combo); //adds the last character  
    return output;
}


Обратите внимание, что вместо использования массива (имеет фиксированный размер) для хранения вывода, я использовал ArrayList,который имеет переменный размер.Также обратите внимание, что это список строк (хранит строки), а не символы.Причина этого заключается в том, что если бы это был список символов, я бы не смог сохранить более одного символа в одном и том же индексе.

В каждой итерации цикла я проверяю равенство между текущимхарактер и это подряд.Переменная combo используется для временного хранения символов (в строке), прежде чем они перейдут к output.

Теперь, чтобы распечатать результаты понятным способом:

public static void main(String[] args) 
{
    String input = "EEEE  BCD DdA";
    ArrayList<String> output = splitString(input);

    System.out.print("[");
    for(int i = 0; i < output.size(); i++) {
        System.out.print("\"" + output.get(i) + "\"");

        if(i != output.size()-1) 
            System.out.print(", ");
    }
    System.out.println("]");
}


Вывод при запуске вышеуказанного кода будет:

["EEEE", " ", "B", "C", "D", " ", "D", "d", "A"]

0 голосов
/ 24 сентября 2018

Вы можете использовать ArrayList типа String для хранения последовательных буквенных строк после их разделения.Этот код должен работать для вас.

import java.util.*;
public class StringSplitter{
        static ArrayList<String> splitString(String str)
        {
            ArrayList<String> result_list= new ArrayList<String>();
            int last_index;
            if(str == null)
            {
                return null;
            }
            else
            {
                while(str.length() != 0)
                {
                last_index = str.lastIndexOf(str.charAt(0));
                result_list.add(str.substring(0, last_index+1));
                str = str.substring(last_index+1);
                }
            }
            return result_list;
            }

        public static void main(String[] args)
        {
            ArrayList<String> result = splitString("AABBCCDDEEE");
            System.out.println(result);

        }
     }

Я использовал ArrayList, потому что он не требует, чтобы вы фиксировали размер при объявлении.

0 голосов
/ 24 сентября 2018

Массивы имеют фиксированную длину, поэтому вы не сможете сделать это с массивом, если не выделите один с достаточным запасом места заранее (для этого потребуется пройти через строку, чтобы узнать, сколько дополнительного места вам нужно).

Вместо этого рассмотрите возможность использования StringBuilder для вывода, который можно преобразовать в массив char, когда вы закончите.

...