Roboter, Befehle parsen

CEric

Aktives Mitglied
Hi, hab ne kleine Roboter Aufgabe, dabei werden mir über einen String Punkte übergeben, die ich nacheinander abfahren soll.
Java:
String string = args[0];
In dem String steht dann pro Zeile ein Punkt mit x und y Koordinate.
Wie bekomme ich jetzt meine einzelnen Punkte aus dem String, und kann die an meinen Roboter übermitteln?
MfG
 
Zuletzt bearbeitet von einem Moderator:
Du kannst den String mit [c]split()[/c] aufsplitten. Oder mit einem [c]Scanner[/c] Zeile für Zeile lesen. Wie sieht das genau Format der Daten aus? Wie musst du das ganze deinem Roboter übergeben?
 
Naja, ich habe folgende Befehle, moveEast(), moveWest(), moveNorth(), moveSouth(), wenn ich jetzt an einem Punkt bin soll ich diesen bemalen, markCurrentNode();
 
Ganz von vorne. Zuerst musst du mal den Input irgendwie in sinnvolle Typen bringen, z.B. [c]List<Point>[/c]. Davon ausgegangen, dass es eine Klasse [c]Point[/c] mit Konstruktor [c]Point(int x, int y)[/c] gibt und dein String so aussieht:
Code:
0 0
17 5
53 22
4 5
kann man das ganze so parsen:
Java:
public List<Point> parseInputData(String input) {
    List<Point> points = new ArrayList<Point>();
    for (String record : input.split("[\\r\\n]+")) {
        if (!record.matches("\\d+\\s+\\d+")) {
            throw new IllegalArgumentException("invalid format for record: " + record);
        }
        String[] values = record.split("\\s+");
        points.add(new Point(Integer.valueOf(values[0]), Integer.valueOf(values[1])));
    }
    return points;
}
Ich splitte also zuerst nach den new Line Characters (\r und \n), danach schau ich, ob die aktuelle Zeile dem Format \d+\s+\d+ (also 1..n Zahlen, danach 1..n Trennzeichen (" ", \t etc.), danach 1..n Zahlen) entspricht. Wenn sie das tut, kann ich einfach nach \s+ trennen und krieg die beiden Werte in [c]values[0][/c] und [c]values[1][/c].
 
Wie sieht die Schnittstelle zu deinem Roboter aus?
Und wie ist jetzt die Frage?

Willst du wissen wie du aus dem String "8,9" Die Zahl 8 und 9 machen kannst?
 
Das mit splitten is klar;
Java:
String[] gesplitted = string.split("\n");
		
		//Fuer Punkt 1, erste Stelle im Array
		String punkt1 = gesplitted[0];
		
		String[] punkte1 = punkt1.split(";");
		//x1 und y1 Werte
		String x1 = punkte1[0];
		String y1 = punkte1[1];
		
		//x1 und y1 Werte in int parsen
		int x_1 = Integer.parseInt(x1);
		int y_1 = Integer.parseInt(y1);

Hab das jetzt mal so, das wäre der erste Punkt, wenn ich das aber für alle Punkte mache, wird das aber saulang.
Problem mit ner Schleife wäre glaub ich, dass ich nicht weis in welcher Reihenfolge ich die Punkte abfahre.
 
Wenn du von meinem Beispielcode [c]record.split("\\s+")[/c] zu [c]record.split("[,;]")[/c] änderst, dann funktioniert es mit einem Komma oder Semikolon (statt Leerzeichen) als Trennzeichen 🙂

Edit: natürlich muss der matcher auch noch updated werden
 
hier mal ein Bsp wie man sowas lösen könnte...ohne irgendwelche Überprüfungen und anderen Kram:
Java:
public static void main(String[] args) {
		String string = "16,16\n8,9\n18,-6\n1,-8\n7,-8\n-1,-8\n-7,13";
		String[] gesplitted = string.split("\n");
		Point[] p = new Point[gesplitted.length];
		for (int i = 0; i < gesplitted.length; i++) {
			String[] punkte = gesplitted[i].split(",");

			int x = Integer.parseInt(punkte[0]);
			int y = Integer.parseInt(punkte[1]);
			Point point = new Point(x, y);
			p[i] = point;
		}
		for (int j = 0; j < p.length; j++) {
			System.out.println("X = " + p[j].x + " ; Y = " + p[j].y);
		}
	}
[XML]X = 16 ; Y = 16
X = 8 ; Y = 9
X = 18 ; Y = -6
X = 1 ; Y = -8
X = 7 ; Y = -8
X = -1 ; Y = -8
X = -7 ; Y = 13
[/XML]
 
versteh ich nicht. In der Reihnefolge wie sie in der Datei stehen oder?

Könnte aber auch ein Travelling-Salesman-Problem dahinterstecken.
Die Punkte wären die Städte die alle besucht werden sollen.
Und jetzt könnte man den kürzesten Pfad für dieses Problem suchen.

Das wäre dann der Fall, wenn man eine andere Reihenfolge bevorzugen wollte.
 
gehts nicht auch mit nem StrTokenizer? und einfach alle delimiter rein?

und dann while (tokenizer.hasNext()) usw?


also ca so

Java:
StrTokenizer splitter = new StrTokenizer(strRoboterbefehle, [";","\n"])

while (splitter.hasMoreElements()){

new point(splitter.nextToken(), splitter.nextToken())

}

in dem sinne?
 
Zuletzt bearbeitet:
Hi, also mein Roboter macht jetzt was er soll.
Nun müsste ich i-wie noch das array
Java:
String[] gesplitted;
, das ja die Punkte enthält, [16,16][8,9][18,-6][1,-8][7,-8][-1,-8][-7,13], sortieren, um eine kürzere reihenfolge beim ablaufen der punkte zu bekommen; kann ich das array jetzt zB nur nach der x koordinate sortieren?
 

Zurück
Oben