Loading...

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

Nukem avatar Nukem 6 Точки

[Technical Issue] Java Basics - Input в while цикъл?

Въпросът ми е следният момчета, опитвам се в един while цикъл да напълня един List масив и когато детектне string "end"/примерно/ да brake-не. Обаче тази елементарна задача от c# нещо се оказа проблемна в Еклипса и неговия странен дебъгер, как е правилно да се направи?

http://pastebin.com/JbAEYDW9

Тагове:
1
Java Advanced 16/01/2015 23:05:56
Samuil.Petrow avatar Samuil.Petrow 1550 Точки

Каква точно е грешката, защото в момента нямам как да го подкарам?

Иначе моите препоръки, гледайки кода:

1. Ползвай един Scanner. Не знам как работят двата паралелно, но не мисля, че е правилно дори и да е осъществимо.

2. Ако няма проблем със спецификата на инпута - ползвай .nextLine(), другите не четат новия ред. ( s.next("\\w+"); - това не знам какво прави, но може би заместваш тази точка с него). Съответно натам ще провериш дали е "end" и ако не е и е parse-able число - ще го парснеш и напълниш, ако пък е друг стринг - ще хвърлиш грешка да бъде въведено число (ако разбира се това ти е целта).

3. Не затваряй Scanner ръчно. Той сам ще се dispose-не когато е нужно. Наков го обясняваше на една от лекциите.

 

1
15/01/2015 17:01:09
Filkolev avatar Filkolev 4482 Точки

Само ще допълня колегата с малко обяснения.

Може да ползваш nextInt() и т.н. без притеснения в определени случаи, но по-сигурно е да взимаш по един ред с nextLine(), да проверяваш какво имаш и на база на това да преценяваш какво да правиш. В тази задача е точно така - не знаеш дали ще ти подадат число или стринг, по-добре първо хвани всичко и провери какво е. Ако е стрингът "end" - приключваш, ако е число - парсваш и буташ в списъка.

Два сканера ще ти трябват ако ползваш различни ресурси, т.е. единият чете от конзолата, другият от файл и т.н. В случая всичко идва от козолата => един сканер.

С командата close() затваряш ресурса, който ползваш. В случая ти ползваш системния вход, конзолата, и не е редно да я затваряш. Принципът е: "затваряш само това, което сам си отворил", например ако четеш от файл, ти първо го отваряш, след което е нормално да го затвориш като приключиш с него. System.in не си го отворил, следователно не е редно да го затваряш. Понеже Еклипса ти вади предупреждение, за да го махнеш имаш опцията suppress warnings.

2
15/01/2015 17:13:12
SPPetrov avatar SPPetrov 43 Точки

Здравей,

мога да добавя, че оператора "==" не работи коректно за String, затова се ползва equals() или в твоя код : if (end.equals("end"))

0
a_rusenov avatar a_rusenov 1103 Точки

Работи си както трябва, просто има разлика между C# и Java и тя е:

  • C#: == сравнява стрингове по стойност (т.е. дали битовете на двата стринга са едни и същи)
  • Java: == сравнява стрингове по референция (т.е. дали сочат към един и същ адрес в паметта)

Попринцип == срявнява всички примитивни типове (освен стринговете) по стойност, докато всички останали се сравняват по референция. В C# обаче и стринговете се сравняват по стойност.

6
15/01/2015 19:23:43
st1nka17 avatar st1nka17 10 Точки

Също съм се сблъсквал с този input и аз го направих така:

while( scanner.hasNext() ) {
String next = scanner.next();
if ( next.equals( "end" ) ) {
break;
}
input.add( Integer.valueOf( next ) );
}

Прочита всичко и ако е число го запазва в листа,ако е въпросния стринг"end" просто прекъсва цикъла.Надявам се да съм помогнал.

2
Nukem avatar Nukem 6 Точки

Мерси за отговорите колеги, за equal и двата скенера отговорите бяха много полезни, направих я задачата :), исках да направя още нещо сега ако детектне "end" break-ва, обяче ако в масива има string различен от "end" дава грешка, и си мислех да направя един boolean метод в който да чеква дали е инт и да връща true и ако хване грешка да връща false!

Обаче нещо метода не иска да си дърпа стойности от ListArrey-а и засега не можах да го подкарам, след работа ще се мъча пак, че изникнаха някой задачки!

http://pastebin.com/utYfzjRc

1
vesheff avatar vesheff 13 Точки

Колега, погледнах ти кода и го пипнах. В метода задаваш променлива лист от String, а трябва да е просто String. 
И е хубаво методът да се казва например isInteger, защото връща bool. Чете се по-лесно. :)
Дано съм ти бил от помощ.
http://pastebin.com/du6jNXdq

1
16/01/2015 17:17:28
Nukem avatar Nukem 6 Точки

Колега златен си мерси много! И благодаря на всички включили се колеги изясних си много неща и се радвам че форумът ни е толкова полезен и има толкова момчета готови да помогнат!

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