Toon posts:

[Java] Integers halen uit een input

Pagina: 1
Acties:

Onderwerpen


Verwijderd

Topicstarter
Beste,

Ik zit met het volgend probleem:

Een user kan door middel van een System.in een input geven.
Deze string bestaat uit meerdere (verschillende) waardes

Java:
1
2
3
4
5
6
7
8
9
  
  Scanner input;
  String type;
  int valueA = 0;
  int valueB = 0;
  String typeB;
  String typeC;
  ArrayList<Integer> positions;
    position = new ArrayList<Integer>();


Java:
1
2
3
4
5
6
7
8
9
  input = new Scanner(System.in);  
  typeA = input.next();
  valueA = input.nextInt();
  valueB = input.nextInt();
  typeB = input.next();
  do {
    position.add(input.nextInt());
  } while(input.hasNextInt());
 typeC = input.next(); 


Nu kan een input er als volgt uit zien:

Java:
1
typeA intA intB typeB positions[] typeC


Dit werkt allemaal prima. Voor typeA, typeB, typeC en intA en intB wordt maar eenmalig een waarde gegeven. Voor het aantal positions wordt dit bepaald door het aantal verschillende getallen dat de gebruiker ingeeft tussen typeB en typeC.

Nu is het probleem dat ik achter typeC ook nog een hele reeks getallen kan hebben. (Dit wordt door de user bepaald)

Alleen als ik dan op de zelfde manier met een ArrayList werk en deze helemaal achteraan zet (dus achter typeC), werkt het niet.
Als er achter typeC nog een reeks getallen plaats dan worden deze netjes in de ArrayList gezet, maar als er achter typeC helemaal geen getal meer volgt, dan blijft het programma vragen om een getal in te voeren.

Nu heb ik dit als volgt proberen op te lossen:

Java:
1
2
3
while(input.hasNextInt) {
position2.add(input.nextInt)
}


Dit werkt alleen jammer genoeg ook niet, het programma blijft namelijk om een getal vragen.

  • hellfighter87
  • Registratie: Mei 2008
  • Laatst online: 18:58
position2.add(input.hasNextInt) <- moet dat neit next int inplaats van hasnext?

ik heb er ff snel overheen gelezen dus heb neit alles op me in genomen zeg maar maar dat viel me op ;o

[ Voor 40% gewijzigd door hellfighter87 op 14-09-2011 19:55 ]


Verwijderd

Topicstarter
hellfighter87 schreef op woensdag 14 september 2011 @ 19:54:
position2.add(input.hasNextInt) <- moet dat neit next int inplaats van hasnext?

ik heb er ff snel overheen gelezen dus heb neit alles op me in genomen zeg maar maar dat viel me op ;o
Je hebt helemaal gelijk, ik pas het even aan.

Edit: Helaas veranderd dit verder niets aan de output

[ Voor 7% gewijzigd door Verwijderd op 14-09-2011 20:04 ]


  • Macros
  • Registratie: Februari 2000
  • Laatst online: 08-10 21:07

Macros

I'm watching...

Ik zou een regular expression gebruiken.
Bijvoorbeeld: "(\w+)\s+(\d+)\s+(\d+)\s+((\d+)\s+)*(\w+)".
Dan zijn je groepen ongeveer dit:
1 = typeA
2 = intA
3 = intB
4 = typeB
6 = positions[] (moet je nog een keer op split(en), om de waardes te krijgen
7 = typeC
Dit matched alleen positieve ints, en alles wat eigenlijk groter is dan een int. Je zal de \d moeten aanpassen naar -?\d om negatieve ints te kunnen matchen. Ook matched dit als er meer dan 1 spatie, of zelfs tabs tussen de input waarden staan.
Het resultaat van de groepen zijn ook Strings, dus die zal je nog met Integer.parseInt() moeten vertalen naar ints.
Zie http://download.oracle.co...a/util/regex/Pattern.html voor meer info.

"Beauty is the ultimate defence against complexity." David Gelernter


  • Lone Gunman
  • Registratie: Juni 1999
  • Niet online
Het probleem is volgens mij dat de System.in inputstream in principe 'oneindig' is; een enter wordt door de scanner niet gezien als het einde van de stream (standaard ziet de scanner alle whitespace, dus ook carriage returns en line feeds als delimiters tussen de tokens). In jouw geval blijft de call naar hasNext dus blocken tot er nieuwe input beschikbaar is.

Een simpele oplossing is eerst de regel inlezen en opslaan in een string, en daarna deze string als input gebruiken voor een scanner. In dat geval zal een call naar hasNext niet blocken als de scanner aan het einde van de string is.

voorbeeldje dat een variabel aantal ints inleest:
Java:
1
2
3
4
5
6
7
BufferedReader lineReader = new BufferedReader(new InputStream(System.in));
String line = lineReader.readLine();
Scanner input = new Scanner(line);
while(input.hasNextInt()) {
   int i = input.nextInt();
   // doe iets met i
}

Experience has taught me that interest begets expectation, and expectation begets disappointment, so the key to avoiding disappointment is to avoid interest.