#java #parseint #charat
#java #синтаксический анализ #символ
Вопрос:
Я пытаюсь взять строку, похожую на эту: 3A5o2n4t и развернуть ее обратно в строку, подобную этой: AAAOOOOONNTTTTT (число перед буквой — это количество повторений буквы) Я пытался использовать Integer.parseInt(), чтобы получить число перед буквой, но оно захватывает все числа. Есть ли способ получать по одному числу за раз? Кроме того, нормально ли выглядит мой код после устранения этой проблемы? Или я все еще немного упускаю?
public String runLengthDecoding(String str3) {
String convert = "";
int number = 0;
if (! str3.isEmpty()) {
convert = str3.charAt(0) "";
}
for (int i = 0; i <= str3.length() - 1; i ) {
if (Character.isDigit(str3.charAt(i))) { //true or false, the current character is a digit
String temp = "" str3.charAt(i); //if true, make that character a string
number = Integer.parseInt(temp); /*now store that character as a number (but I only want the current
number, not all the numbers in the string*/
System.out.println(number); /*Testing to see what number is, which is where I found it was
storing all the numbers */
String temp2 = str3.charAt(i 1) ""; //Its supposed to start making a string that prints the character in front of it
convert = temp2.repeat(number); //it will print the character however many times that number was stored as
}
}
return convert;
}
Также я еще не научился использовать массивы, вот почему я не использую массив.
Комментарии:
1. Кажется, что вы используете здесь неопределенный метод ->
temp2.repeat(number);
2. Когда я искал метод repeat, он был настроен как String.repeat(int). Я думаю, что это не определено, потому что число — это не просто 1 число
3. Можете ли вы опубликовать ссылку, по которой вы нашли
String.repeat()
метод?4. w3schools.com/jsref/jsref_repeat.asp
5. Тот, который вы опубликовали, является методом JavaScript. Вы используете Java. Не путайте JavaScript с Java или наоборот
Ответ №1:
Отредактировано для:
— размещения строк длиной более 1. Пример: 10AA
— размещения входных данных, начинающихся со строки. Пример: A5o
Чтобы решить эту проблему, вы должны получить все одновременные цифры, например, если у вас есть «55s», вы должны получить «55», вот почему ваш код неверен, поскольку, если вы parseInt всякий раз, когда видите цифру, она немедленно преобразуется в 5, но фактическое число равно 55, таким образом, вы должны сначала накапливать одновременные цифры и только parseInt когда вы сталкиваетесь с первой не цифрой.
Обратитесь к коду и комментариям для получения подробной информации:
public class Main {
public static void main(String[] args) {
System.out.println("Input: 3A5o2n4t => Output : " runLengthDecoding("3A5o2n4t"));
System.out.println("Input: 3AA5o2n4t => Output : " runLengthDecoding("3AA5o2n4t"));
System.out.println("Input: 10A5o2n4t => Output : " runLengthDecoding("10A5o2n4t"));
System.out.println("Input: 10AA5o2n4t => Output : " runLengthDecoding("10AA5o2n4t"));
System.out.println("Input: A5o => Output : " runLengthDecoding("A5o"));
System.out.println("Input: AB5o => Output : " runLengthDecoding("AB5o"));
}
public static String runLengthDecoding(String str3) {
String convert = "";
int number = 0;
String numberString = "";
String toBeRepeatedString = "";
boolean flag = false;
for (int i = 0; i <= str3.length() - 1; i ) {
char currentChar = str3.charAt(i);
if (Character.isDigit(currentChar)) { // true or false, the current character is a digit
numberString = numberString currentChar; // store the possible integer
} else {
if (i 1 < str3.length()) {
char nextChar = str3.charAt(i 1); // check if the next char is a digit
if (!Character.isDigit(nextChar)) { // if not a digit then append toBeRepeatedString
if (i == 0 || i 1 >= str3.length()) {
flag = true;
} else {
toBeRepeatedString = nextChar;
flag = false;
}
} else {
flag = true;
}
}
if (flag) {
toBeRepeatedString = currentChar;
// This will accomodate inputs "A3B";
if (!numberString.isEmpty()) {
number = Integer.parseInt(numberString); // parse the number of repeats
} else {
number = 1;
}
numberString = ""; // reset number
String temp2 = "";
// Repeat the currentChar
for (int j = 0; j < number; j ) {
temp2 = toBeRepeatedString;
}
convert = convert temp2; // store it to the result
toBeRepeatedString = ""; // reset toBeRepeatedString
}
}
}
return convert;
}
}
Результат:
Input: 3A5o2n4t => Output : AAAooooonntttt
Input: 3AA5o2n4t => Output : AAAAAAooooonntttt
Input: 10A5o2n4t => Output : AAAAAAAAAAooooonntttt
Input: 10AA5o2n4t => Output : AAAAAAAAAAAAAAAAAAAAooooonntttt
Input: A5o => Output : Aooooo
Input: AB5o => Output : ABooooo
Комментарии:
1. Разве я не хотел бы выполнить parseInt, если утверждение true или false истинно? Кроме того, не является ли numberString просто пустой строкой в операторе else?
2. Вы должны получить все одновременные целые числа, например, если у вас есть «55s», и если вы выполняете синтаксический анализ каждый раз, когда видите цифру, то она немедленно преобразуется в 5, но фактическое число равно 55, таким образом, вы должны накапливать одновременные целые числа и анализировать только тогда, когда вы сталкиваетесь с не цифрой. Числовая строка будет содержать эти возможные цифры, вы добавляете эти цифры всякий раз, когда сталкиваетесь с цифрой, и если вы столкнетесь с не цифрой, вы сначала преобразуете ее в int, а затем сбрасываете числовую строку в empty («»), чтобы она могла содержать следующие возможные цифры
3. Хорошо, это имеет смысл, спасибо. Я смог исправить свой код так, чтобы он работал с вашей помощью. Однако я заметил, что если я помещаю число, после которого появляется символ, он возвращает ошибку: «Исключение в потоке «main» java.lang.NumberFormatException: Для входной строки: «» » Вы знаете, почему это? (поэтому вместо 3A5o2n4t я делаю A3o5n2t4)
4. Я отредактировал свой ответ, пожалуйста, проверьте. Я не включил этот тестовый пример. Я отредактирую свой код. Пожалуйста, подождите
5. Что такое try and catch?
Ответ №2:
Вот лучший способ решения вышеупомянутой проблемы, он будет обрабатывать все ваши сценарии:
public static void main(String[] args) {
String input = "5a2s3T66e";
System.out.println("Input is: " input " and output is: " expandingCondenseString(input));
}
private static String expandingCondenseString(String input){
StringBuilder result = new StringBuilder();
String size = "";
String value = "";
for (int i=0;i<input.length();i ){
if (Character.isDigit(input.charAt(i))) {
size = size input.charAt(i);
} else {
value = value input.charAt(i);
if(i 1<input.length() amp;amp; !Character.isDigit(input.charAt(i 1))){
continue;
}
if(size.isEmpty()){
size = "1";
}
for (int j=0;j<Integer.parseInt(size);j ){
result.append(value);
}
size = "";
value = "";
}
}
return String.valueOf(result);
}