Отримайте рядковий символ за індексом - Java


230

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

Примітка - під вищезазначеним питанням під "символом" я маю на увазі не тип даних char, а букву чи цифру в рядку. Тут важливо те, що я не отримую знак, коли викликається метод, а рядок (довжиною 1). І я знаю про метод substring (), але мені було цікаво, чи є акуратніший спосіб.


13
Це є? Відповідь досить проста.
ametren

Ви помітили, що він не хоче charцінності? І він знає, як це зробити, substring()але просто хоче "акуратніше" шляху. FYI, я можу сказати, що substring()це найновіший спосіб.
user845279

3
@ user845279 Character.toStringвідповідає всім необхідним вимогам і зовсім не брудниться .
Рікардо Альтамірано

@pythonscript Я згоден, але це не сильно відрізняється від використання substring()безпосередньо.
user845279

1
Я спізнююсь на цю вечірку, але @RicardoAltamirano трохи помиляється. endIndex(Другий параметр) з String.substring(int, int)є ексклюзивним індексом, і він НЕ буде кидати виняток для index + 1тих пір , поки index < length()- що вірно навіть для останнього символу в рядку.
Вільям Прайс

Відповіді:


339

Ви шукаєте метод 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 .


1
"Тут важливо те, що я не отримую знак, коли викликається метод, а рядок", але все одно дякую (upvote): D
Bluefire

1
Я думаю, що відповідь Сільвена Леру краща. doc про персонаж
Chaojun Zhong

Я погоджуюся з @ChaojunZhong, це більш відповідна відповідь, оскільки не доцільно використовувати charAt (), оскільки у вас виникнуть проблеми, коли у вас є символи, яким потрібні 2 одиниці коду.
bpunzalan

43

Ти хочеш .charAt()

Ось підручник

"mystring".charAt(2)

повертає s

Якщо ви перебуваєте у пеклі, що має рядок, є кілька способів перетворення знаку в рядок:

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

Або

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

Або навіть

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

Наприклад.


@ametren Чи бажано об'єднання рядкових рядків Character.toString?
Рікардо Альтамірано

Я думаю, що це може звестись до питання особистого уподобання. Ви також можете зробитиString mychar = String.valueOf("mystring".charAt(2));
ametren

Якщо говорити про своє, моє особисте уподобання в цьому випадку було б String mychar = ""+"mystring".charAt(2);тому, що це найбільш стисло. Інші будуть відрізнятись своєю думкою з цього приводу.
ametren

10

Жодна із запропонованих відповідей не працює для сурогатних пар, які використовуються для кодування символів поза базовою багатолігальною площиною Unicode .

Ось приклад з використанням трьох різних прийомів для перебору символів рядка (у тому числі за допомогою потоку API Java 8). Зверніть увагу, що цей приклад включає символи Додаткової багатомовної площини Unicode (SMP). Для правильного відображення цього прикладу та результату потрібен правильний шрифт.

// 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

Третє рішення в основному таке ж, як і друге, але використовуючи API Java 8 Stream :

/* 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   𓊃 𓍿 𓅓 𓃡 

Як ви бачите (якщо ви вмієте відображати ієрогліфи належним чином), перше рішення не обробляє належних символів поза межами BMP Unicode. З іншого боку, два інші рішення добре справляються із сурогатними парами.


8

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


Досить справедливо. Але, оскільки char є примітивним типом, я припускаю, що toString()він не буде працювати над ним, і valueOf()лише для чисел (я думаю, я можу помилятися), так як я перетворять char у рядок?
Bluefire

"у вищезазначеному питанні, за характером" Я не маю на увазі тип даних char "- я не читаю це як" я не прийму char"
ametren

@Bluefire Дивіться мою відповідь. Character.toStringповинен працювати (це статичний метод з Characterкласу.
Рікардо Альтамірано


5

Гібридний підхід, який поєднується charAtз вашою вимогою не отримувати чар, може бути

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

Але це насправді не «акуратніше», ніж substring()чесно.



4

Ось правильний код. Якщо ви використовуєте zybooks, це відповість на всі проблеми.

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

0

якщо хтось бореться з kotlin, код:

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

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


-3

Подобається це:

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

ОП заявило, що Stringдовжина 1 бажана, а не а char.
Вільям Прайс

Шість інших відповідей, включаючи прийняту, запропонували charAt()як можливе рішення. Що додає ця відповідь?
Ден Гетц

6
Крім того, схоже, що ви натякаєте, що charAt()використовує індекси на основі 1, маючи aна третьому місці єдиний різний символ . Якби це було правдою, то вам було б краще сказати чи пояснити це, ніж натякати на це. Насправді , що це НЕ вірно: charAt()використовує 0 на основі індексів, так sбуде 'h'.
Dan Getz
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.