Я запутываю, как преобразовать значения в массив 2D char в число (целое число).
Пусть предполагается, что массив: [[a, b],[c, d],[e, f]]
или {{'a','b'},{'c','d'},{'e','f'}}
Все значения в этом массиве будут преобразованы в число, a = 0, b = 1, c = 2, d = 3, e = 4, f = 5.
Я ожидаю результат: [[0, 1], [2, 3], [4, 5]]
или {{0, 1},{2, 3},{4, 5}}
Если это просто строка "abcdef", я могу использовать charAt(), но я могу использовать ее в массиве, особенно в массиве символов. Итак, я использую.replace.
package array_learning;
public class test {
public static void main(String[] args){
char [][] word= {{'a','b'},{'c','d'},{'e','f'}};
int strLength = word.length;
for(int i = 0; i<strLength; i++){
for(int j=0; j<2; j++){
String strWord = Character.toString(word[i][j]);
strWord = strWord.replace("a","0");
strWord = strWord.replace("b","1");
strWord = strWord.replace("c","2");
strWord = strWord.replace("d","3");
strWord = strWord.replace("e","4");
strWord = strWord.replace("f","5");
System.out.print(strWord+" ");
}
System.out.println();
}
}
}
Но результат не тот, который я ожидал.
Результат:
0 1
2 3
4 5
Как решить это правильно?
Рассматривать:
import java.util.Arrays;
public class Ctest {
public static void main(String[] args) {
char[][] word= { {'a', 'b'}, {'c', 'd'}, {'e', 'f'} };
println(word); // format with brackets e.g., [[a, b], [c, d]]
System.out.println(Arrays.deepToString(word)); // same format
for (int i = 0; i < word.length; i++) {
for (int j = 0; j < word[i].length; j++) {
if (word[i][j] >= 'a' && word[i][j] <= 'f') {
word[i][j] = (char) ((word[i][j] - 'a') + '0');
}
}
}
println(word); // formatted with brackets
printPlain(word); // formatted without brackets
}
public static void println(char[][] word) {
System.out.print("[");
for (int i = 0; i < word.length; i++) {
if (i > 0) System.out.print(", ");
System.out.print("[");
for (int j = 0; j < word[i].length; j++) {
if (j > 0) System.out.print(", ");
System.out.print(word[i][j]);
}
System.out.print("]");
}
System.out.println("]");
}
public static void printPlain(char[][] word) {
for (int i = 0; i < word.length; i++) {
if (i > 0) System.out.print(", ");
for (int j = 0; j < word[i].length; j++) {
if (j > 0) System.out.print(", ");
System.out.print(word[i][j]);
}
}
System.out.println();
}
}
Основные изменения, которые я сделал, заключаются в том, что значения в массиве фактически конвертированы (я не уверен, что вы этого хотите, вы не сохраняли какие-либо новые значения в массиве раньше), данные обрабатываются как char
без преобразованный в String
, преобразование выполняется с помощью вычисления вместо специального случая для каждого значения, а преобразование данных и их печать были отделены друг от друга.
Есть также несколько незначительных изменений. Теперь данные печатаются в формате, который вы продемонстрировали, в скобках нет предположения, что внутренние массивы всегда имеют ровно два элемента, а имя класса было изменено, чтобы начать с заглавной буквы.
Еще одно небольшое примечание. На линии, которая преобразует значения из строчных букв в цифры, выражение находится в круглых скобках и отбрасывается на char
. Это связано с тем, что при добавлении и вычитании chars
Java выполняет расширенное преобразование в int
, поэтому для сохранения значения обратно в char[][]
необходимо снова отправить его на char
.
Я забыл, что в Java уже существует метод в классе java.util.Arrays
для форматирования многомерного массива с помощью скобок: Arrays.deepToString(word)
предоставит вам тот же формат, что и метод println
выше. Я также показал метод printPlain
который аналогичен, но не имеет скобок, если вы предпочитаете более чистый формат вывода. Вы также можете легко изменить этот метод, чтобы он добавлялся к StringBuilder
и возвращал String
, вместо того, чтобы печатать массив напрямую.
Используйте Arrays.toString()
для преобразования вашего массива в строку сначала. Затем сделайте замену. Например:
char [][] word= {{'a','b'},{'c','d'},{'e','f'}};
String strWord = "";
for(char []w : word){
// convert array int [x, y] format
strWord += Arrays.toString(w)+",";
}
// removing comma(,) from end.
strWord = strWord.replaceAll(",$", "");
// do your replacement.
strWord = strWord.replace("a","0");
// ... more
// output
System.out.println("["+strWord+"]");
Все правильно соответствует. Это массив 2d, поэтому ваши массивы печатаются один за другим.
Если вы не хотите, чтобы они шли по отдельным линиям, то избавляйтесь от System.out.println();
в конце цикла for.