Почему я должен использовать Array.toString в методе Split? - PullRequest
1 голос
/ 02 ноября 2011

Я не знаю, почему я должен использовать Array.toString в методе split (String reges).Я пробовал это, если я оставляю метод Array.toString (), но после этого метод записывает только адрес памяти.

Это оригинальный код:

public static String knights=
        "Then, when you have found the shrubbery, you must " +
        "cut down the mightiest tree in the forest... " +
        "with... a herring!";

public static void split(String regex){
    System.out.println(Arrays.toString(knights.split(regex)));
}

И я пробовал это:

public static void split(String regex){
    System.out.println(knights.split(regex).toString());
}

Но он записывает только адрес, и не содержитрыцарей.

Или как я могу переписать метод split без использования метода Arrays.toString ()?

Ответы [ 7 ]

2 голосов
/ 02 ноября 2011

Вызов Arrays.toString необходим, потому что String#split возвращает массив строк.В качестве альтернативы вы можете выполнить итерацию результатов следующим образом:

String[] results = knights.split(regex);
for (String result : results) {
    System.out.println(result);
}

Форматирование вывода будет немного другим, но оно достигнет той же идеи.Но, как вы видите, Arrays.toString немного более лаконичен и требует меньше усилий с вашей стороны.Однако метод итерации (см. Выше) дает вам больший контроль над форматированием вывода.

2 голосов
/ 02 ноября 2011

Причина, по которой ваша программа печатает адрес памяти, заключается в том, что именно так ведет себя метод toString () массива (а String.split () возвращает String-array).

Почему вы не хотите использовать Arrays.toString ()?Не совсем понятно, какой выход вы желаете.Если вы просто хотите другой способ для того же вывода, вы можете сделать это:

String[] splitted = knights.split(regex);
List<String> list = Arrays.asList(splitted);
System.out.println(list);
0 голосов
/ 02 ноября 2011

Еще во времена Java 1.0 метод .toString () для массивов был реализацией по умолчанию, поэтому

knights.split(regex).toString()

распечатал бы

[java.lang.String@01234abcdef]

или что-то еще (я не могу вспомнить точное форматирование). В конце концов было решено, что должен быть хороший способ красивой печати массивов, но было слишком поздно менять поведение или array.toString ().

Таким образом, одним из статических вспомогательных методов в java.util.Arrays является новый метод .toString (array), и поэтому нельзя просто вызывать .toString () для массива.

Как уже отмечали другие люди, если вы действительно хотите избежать Arrays.toString (), вы можете использовать цикл. Но библиотечная функция должна использоваться.

0 голосов
/ 02 ноября 2011

См. API Doc для Arrays, в котором заключается служебный метод toString, вам нужно понимать, что он делает, когда вы передаете ему массив.И этот метод используется в «исходном коде».

Но в вашем коде вы вызываете другой метод toString.

0 голосов
/ 02 ноября 2011

Try ...

public static void split(String regex){
    String[] strArr = knights.split(regex); // Split the knights string using the specified delimiter
    // Cycle through the array
    for (String a : strArr) {
        System.out.print(a + " ");
    }
    System.out.println();
}

Чистые массивы не имеют хорошего метода toString, как другие объекты в Java (который объясняет, почему вы получили адрес, а не список элементов). Таким образом, чтобы распечатать содержимое массива, вам почти всегда нужно будет выполнять итерацию по нему с помощью цикла for ИЛИ использовать статический метод toString класса Array, как вы это делали в своем первом фрагменте, который в значительной степени делает то же самое. вещь для тебя.

В целом, неявное toString, такое как System.out.println(someArray), отличается от Array.toString(someArray).

0 голосов
/ 02 ноября 2011

Массив - это особый тип объекта в Java, он должен обрабатываться компилятором по-разному (например, индексирование). Он использует Object метод по умолчанию toString(), который печатает только адрес. Массив (String[] здесь) НЕ является экземпляром Arrays, который является только вспомогательным классом для работы с массивами.

0 голосов
/ 02 ноября 2011

Когда вы используете метод String.split (), он возвращает массив String, которые были изначально разделены на основе вашего регулярного выражения.

Класс Array переписал метод toString (), поэтому при его использовании внутри системы.out заявление, что вы смогли увидеть все токены.

...