Loading...

Във форума е въведено ограничение, което позволява на потребителите единствено да разглеждат публикуваните въпроси.

Ivailo_Kodov avatar Ivailo_Kodov 97 Точки

Четене и split() директно в char[]

Колеги, моля помогнете,че се чувствам много тъп, че съм забравил как ставаше..

Искам  директно с четенето от конзолата, да  вкарвам някакви чарове в char[].

Примерно:  String  name = "I, V, A, I, L, O" , Да му направя split по (",\\s*")  и да го запиша в char[].

или  char[] charName = scanner.nextLine().split(",\\s*").toCharArray ...  със стрийм май ставаше ама паметта ми изневерява вече :D

 

Тагове:
0
Java Advanced
kaloyannikov avatar kaloyannikov 531 Точки
char[] chars = scanner.next().toCharArray();

 

1
Ivailo_Kodov avatar Ivailo_Kodov 97 Точки

Написах, че искам и да сплитвам в същото време по нещо ... 

0
stela.iv avatar stela.iv 115 Точки
String[] st =scn.nextLine().split(",");
char[]ch = new char[st.length];
for (int i = 0; i < st.length; i++) {
    ch[i]=  st[i].charAt(0);
}

Ама работи само при условие, че получаваш само единични символи с разделител(в случая ",")

Не ми идва друго на ум, а и не съм сигурна за какво точно ти трябва.Това ще ти свърши работа само за посочения пример. Ако ти трябва за нещо от порядъка на( IV,A,IL,O), предложението няма да работи коректно :)

А за да сплитваш и директно да ги вкарваш в char[], аз лично не намирам вариант, може и да има, ама и идея си нямам ;)

Поздрави

0
20/04/2016 16:57:28
Ivailo_Kodov avatar Ivailo_Kodov 97 Точки

В случая не ми трябва  за нещо.. аз мога да се оправя с други начини,но мисля,че имаше начин да е на един ред с отваряне на стрийм ...От любопитство питам,задачите съм си ги решил вече :D

1
RoYaL avatar RoYaL Trainer 6849 Точки

"със стрийм май ставаше" ми звучи като вариант, в който се опитваш да зазубриш как определени неща работят, вместо да ги помислиш.

Нека помислим над проблема ти:

"I, V, A, I, L, O" сплитнато по ",\\s" ще върне стринг масив, във всеки от които ще има по една буква репрезентирана като стринг.

Което общо взето означава, че си направил това, което искаш, с изключение на факта, че въпреки че всеки един елемент от масива е една буква, то той се запазва като String. Т.е. трябва да създадеш нов масив от чарове, който взима първия символ от текста на този масив, т.е. ще има абсолютно същите данни но с друг тип - char.

За да стане това, трябва да обиколиш масива. Единият вариант е да го обиколиш сам с цикъл, другия вариант е да предоставиш custom функция, която да се изпълни за всеки един елемент, чрез map()

map() е част от Stream API, така че си прав - ще свърши работа. Функцията map() приема функция, която има един аргумент - от типа на елемент от масива (String в случая) и връща произволно избран от нас тип (char в случая)

Т.е. трябва ни функция char myFunc(String element) { return element.charAt(0); }

За щастие map() освен именовани функции, може да приема и анонимни функции, така че можем да го опростим до e -> e.charAt(0);

После обратно ще трябва да го превърнеш в масив, тъй като в момента имаш Stream<Character>. Резултатът, който искаш е Character[]  така, че ще трябва да извикаш toArray() с IntFunction, където параметърът е size на stream-а, а връщаната стойност е нов масив от Character (ref: http://stackoverflow.com/questions/23079003/how-to-convert-a-java-8-stream-to-an-array)

Общо взето цялата работа се опростява до:

Arrays.stream(letters)
                        .map(e -> e.charAt(0))
                        .toArray(Character[]::new);

Но идеята ми беше да разбереш какво не си успял да домислиш, вместо просто да го препишеш. И като цяло да мислиш, вместо да се опитваш да запомняш определени снипети какво вършат.

Разбира се този подход има проблеми - ако след split() ти върне масив от стрингове с повече от един символ, после charAt(0) ще изреже всичко след първия.

Друг вариант е вместо да split-ваш, да заместиш (replace) ненужните символи и така ще получиш един цял стринг само от желаните символи. Тогава toCharArray() ще го върне в масив от char-ове.

3
Ivailo_Kodov avatar Ivailo_Kodov 97 Точки

На логика го докарах същото до toArray() и не разбрах,защо не работи.За това,че иска  Character[]::new  не съм се сетил.Мислех,че направо ще си ги вкара в char[] . Много време го мислих и опитвах без успех. Дано подробното обяснение да помогне и на други :)

Голямо БЛАГОДАРЯ :) 

0
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.