Получить строковый символ по индексу - Java

Я знаю, как выработать индекс определенного символа или числа в строке, но есть ли какой-либо предопределенный метод, который я могу использовать, чтобы дать мне персонаж на n-й позиции? Поэтому в строке "foo", если бы я попросил символ с индексом 0, он вернул бы "f".

Примечание. В приведенном выше вопросе, по символу, я не имею в виду тип данных char, а буква или число в строке. Важно то, что при вызове метода я не получаю char, а строку (длиной 1). И я знаю о методе substring(), но мне было интересно, был ли более простой способ.

Ответ 1

Вы ищете метод charAt. Вот пример:

String text = "foo";
char charAtZero = text.charAt(0);
System.out.println(charAtZero); // Prints f

Для получения дополнительной информации см. документацию по Java на String.charAt. Если вам нужен другой простой учебник, этот или этот.

Если вы не хотите получать результат как тип данных char, а как строку, вы должны использовать метод Character.toString:

String text = "foo";
String letter = Character.toString(text.charAt(0));
System.out.println(letter); // Prints f

Если вам нужна дополнительная информация о классе Character и методе toString, я взял информацию из документации по Character.toString.

Ответ 2

Вы хотите .charAt()

Здесь учебник

"mystring".charAt(2)

возвращает s

Если вы чертовски настроили строку, есть несколько способов конвертировать char в строку:

String mychar = Character.toString("mystring".charAt(2));

Или

String mychar = ""+"mystring".charAt(2);

Или даже

String mychar = String.valueOf("mystring".charAt(2));

Например.

Ответ 3

Вы довольно застряли с substring(), учитывая ваши требования. Стандартный способ был бы charAt(), но вы сказали, что не будете принимать тип данных char.

Ответ 4

Ни один из предложенных ответов не подходит для суррогатных пар, используемых для кодирования символов вне базовой многоязычной плоскости Unicode.

Вот пример, использующий три различных метода для перебора "символов" строки (включая использование потокового API Java 8). Обратите внимание, что этот пример включает символы дополнительной многоязычной плоскости (SMP) Unicode. Вам нужен правильный шрифт, чтобы правильно отобразить этот пример и результат.

// String containing characters of the Unicode 
// Supplementary Multilingual Plane (SMP)
// In that particular case, hieroglyphs.
String str = "The quick brown 𓃥 jumps over the lazy 𓊃𓍿𓅓𓃡";

Итерация символов

Первое решение - это простой цикл над всеми char строки:

/* 1 */
System.out.println(
        "\n\nUsing char iterator (do not work for surrogate pairs !)");
for (int pos = 0; pos < str.length(); ++pos) {
    char c = str.charAt(pos);
    System.out.printf("%s ", Character.toString(c));
    //                       ^^^^^^^^^^^^^^^^^^^^^
    //                   Convert to String as per OP request
}

Итерация кодовых точек

Второе решение также использует явный цикл, но доступ к индивидуальному код указывает с помощью codePointAt и увеличивает индекс цикла соответственно на charCount:

/* 2 */
System.out.println(
        "\n\nUsing Java 1.5 codePointAt(works as expected)");
for (int pos = 0; pos < str.length();) {
    int cp = str.codePointAt(pos);

    char    chars[] = Character.toChars(cp);
    //                ^^^^^^^^^^^^^^^^^^^^^
    //               Convert to a 'char[]'
    //               as code points outside the Unicode BMP
    //               will map to more than one Java 'char'
    System.out.printf("%s ", new String(chars));
    //                       ^^^^^^^^^^^^^^^^^
    //               Convert to String as per OP request

    pos += Character.charCount(cp);
    //     ^^^^^^^^^^^^^^^^^^^^^^^
    //    Increment pos by 1 of more depending
    //    the number of Java 'char' required to
    //    encode that particular codepoint.
}

Перебирайте кодовые точки с помощью Stream API

Третье решение в основном совпадает со вторым, но использует Java 8 Stream API:

/* 3 */
System.out.println(
        "\n\nUsing Java 8 stream (works as expected)");
str.codePoints().forEach(
    cp -> {
        char    chars[] = Character.toChars(cp);
        //                ^^^^^^^^^^^^^^^^^^^^^
        //               Convert to a 'char[]'
        //               as code points outside the Unicode BMP
        //               will map to more than one Java 'char'
        System.out.printf("%s ", new String(chars));
        //                       ^^^^^^^^^^^^^^^^^
        //               Convert to String as per OP request
    });

Результаты

Когда вы запускаете эту тестовую программу, вы получаете:

Using char iterator (do not work for surrogate pairs !)
T h e   q u i c k   b r o w n   ? ?   j u m p s   o v e r   t h e   l a z y   ? ? ? ? ? ? ? ? 

Using Java 1.5 codePointAt(works as expected)
T h e   q u i c k   b r o w n   𓃥   j u m p s   o v e r   t h e   l a z y   𓊃 𓍿 𓅓 𓃡 

Using Java 8 stream (works as expected)
T h e   q u i c k   b r o w n   𓃥   j u m p s   o v e r   t h e   l a z y   𓊃 𓍿 𓅓 𓃡 

Как вы можете видеть (если вы умеете правильно отображать иероглифы), первое решение не обрабатывает должным образом символы за пределами Unicode BMP. С другой стороны, два других решения хорошо работают с суррогатными парами.

Ответ 5

Вы можете использовать результат метода String.charAt(int index) в качестве параметра для String.valueOf(char c).

String.valueOf(myString.charAt(3)) // This will return a string of the character on the 3rd position.

Ответ 6

Это так же просто, как:

String charIs = string.charAt(index) + "";

Ответ 7

Гибридный подход, сочетающий charAt с вашим требованием не получать char, может быть

newstring = String.valueOf("foo".charAt(0));

Но на самом деле это не "опрятно", чем substring().

Ответ 8

Здесь правильный код. Если вы используете zybooks, это решит все проблемы.

for (int i = 0; i<passCode.length(); i++)
{
    char letter = passCode.charAt(i);
    if (letter == ' ' )
    {
        System.out.println("Space at " + i);
    }
}

Ответ 9

если кто-то борется с kotlin, код:

var oldStr: String = "kotlin"
var firstChar: String = oldStr.elementAt(0).toString()
Log.d("firstChar", firstChar.toString())

это вернет символ в позиции 1, в этом случае к помните, индекс начинается с позиции 0, поэтому в этом примере: kotlin будет k = позиция 0, o = позиция 1, t = позиция 2, l = позиция 3, i = позиция 4 и n = позиция 5

Ответ 10

Вот так:

String a ="hh1hhhhhhhh";
char s = a.charAt(3);