Einträge aus Tupeln nach Regeln in Liste speichern

AshCatchem

Mitglied
Guten Abend zusammen, ich komme bei meiner Programmieraufgabe nicht weiter und benötige eure Hilfe.

Ich muss Wegpunkte einer Route hinzufügen. Diese Wegpunkte haben einen Nachbarn und sind gemeinsam mit deren Score in einem Objekt gespeichert. Dieses Tupel hat widerum einen Score.
Als aufgeschriebene Liste sähe das so aus :

Wegpunkte, Bewertung
(3,5), 100
(4,6), 91
(1,7) 87
(3,6) 80
(5,6) 77 usw.

Ich muss nun die Wegpunkte absteigend nach deren Score in die Route speichern. In diesem Fall also 3,5,6,4,...

Auf dem Papier kann ich das, aber ich bekomme es nicht in den PC. Das sortieren der Tupel nach deren Score ist kein Problem, allerdings komme ich bei den ganzen erforderlichen Schleifen und Bedingungen durcheinander, wenn es darum geht, die Route zu bilden. Kann mit jemand auf die Sprünge helfen? Ich würde gerne selbst auf die Lösung kommen.

Viele Grüße
 

httpdigest

Top Contributor
Meine Vermutung ist, dass die Pfadsegmente in beide Richtungen traversierbar sind, und sie nur in irgendeiner kanonischen Form aufgeschrieben werden mussten (also niedrigste Zahl zuerst). Ich nehme an, dass ein (a, b) dasselbe ist wie ein (b, a).
Das heißt: (3, 5) -> (5, 6) -> (4, 6). Der letzte wäre dann 6 -> 4.
 

AshCatchem

Mitglied
Entschuldigt bitte die unklare Formulierung. Sowie es httpdigest beschreibt, ist es richtig, allerdings mit einem entscheidenden Hinweis: Standorte befinden sich nur einmal in einer Route . Die Werte in den Klammern sind Indizes für Standorte. (a, b) entspricht (b, a) und es wird nach absteigendem Score sortiert. Weil man einen Ort nicht doppelt besucht, fliegt der natürlich raus. Ich habe deshalb auch diese "doppelten" Einträge in meinem sortierten Array erlaubt (anders als hier aufgeschrieben), damit das einfacher zu handhaben ist. Mir fällt bloß keine allgemeingültige Vorschrift ein, wie ich das umsetzen soll. Mein Ansatz wäre mit vielen if Verzweigungen und das gefällt mir gar nicht. Wie gehe ich sowas am besten an?
 
Zuletzt bearbeitet:

httpdigest

Top Contributor
Wenn die Paare reflexiv sind, dann ist mir eigentlich nur unklar, woher du weißt, mit welchem Ort/Knoten genau angefangen werden soll. Das Pfadsegment (3, 5) kann ja heißen, dass mit 3 oder mit 5 angefangen werden kann. Und das wiederum bedingt, welche nächsten Pfadsegmente verwendet werden können, die unterschiedliche Scores haben können. Woher weißt du also am Anfang bei (3, 5), dass auch mit 3 -> 5 und nicht eben mit 5 -> 3 begonnen werden soll?

Der letzte Weg ist nicht von 6 zu 4, da 4 bereits in der Route vorkommt.
Ach nein? Wo kommt denn 4 schon vor, wenn nicht ganz am Schluss von 6 -> 4? Und wie kommst du dann auf 3,5,6,4?
 

AshCatchem

Mitglied
Hab's in meinem Post korrigiert, alles gut. Das ist ein berechtigter Einwand. Als erster Ansatz wird beim ersten Weg vorgeschrieben, dass dieser in aufsteigender Reihenfolge der Indizes abzulaufen hat.
 

httpdigest

Top Contributor
Hier ist schonmal eine mögliche inperformante Lösung:
Java:
import static java.lang.Integer.compare;
import static java.util.Arrays.*;
import static java.util.stream.Collectors.*;
import java.util.*;
public class Path {
  public static void main(String[] args) {
    // Repräsentation eines Pfadsegmentes
    class Segment implements Comparable<Segment> {
      int a, b, score;
      Segment(int a, int b, int score) {
        this.a = a;
        this.b = b;
        this.score = score;
      }
      // Zum Sortieren nach Score und kanonischer
      // Reihenfolge (a, b) mit a < b
      public int compareTo(Segment o) {
        int byScoreDesc = compare(o.score, score);
        int byA = compare(a, o.a);
        int byB = compare(b, o.b);
        return byScoreDesc != 0
            ? byScoreDesc
            : byA != 0 ? byA : byB;
      }
      public String toString() {
        return "(" + a + ", " + b + "), " + score;
      }
      // Zum Entfernen von Duplikaten
      public int hashCode() {
        return a ^ b;
      }
      // Zum Entfernen von Duplikaten
      public boolean equals(Object obj) {
        Segment other = (Segment) obj;
        return a == other.a && b == other.b
            || a == other.b && b == other.a;
      }
    }
    // Eingabeliste (wie vom ersten Post, nur
    // shuffled und mit (a, b) == (b, a) Duplikaten)
    List<Segment> segments = asList(
      new Segment(4, 6, 91),
      new Segment(5, 6, 77),
      new Segment(6, 3, 80),
      new Segment(1, 7, 87),
      new Segment(6, 5, 77),
      new Segment(5, 3, 100),
      new Segment(7, 1, 87),
      new Segment(3, 6, 80),
      new Segment(6, 4, 91),
      new Segment(3, 5, 100)
    ).stream()
     .sorted() // <- sortieren nach Score und nach (a, b) mit a < b
     .distinct() // <- Entfernen von Duplikaten (a, b) == (b, a)
     .collect(toList());
    // Erstes Pfadsegment ist immer das mit
    // dem höchsten Score
    Segment first = segments.remove(0);
    // Erzeuge mutable result Liste mit initial
    // a -> b aus dem ersten Pfadsegment
    List<Integer> result = new ArrayList<>(
        asList(first.a, first.b)
    );
    // next enthält immer den als nächstes zu suchenden Startpunkt
    int next = first.b;
    // Ermittle alle nachfolgenden Pfadsegmente
    do {
      final int n = next;
      Integer i = segments
          .stream()
          // Ermittle erstes/höchstes Pfadsegment mit passendem Startpunkt
          .filter(s -> s.a == n && !result.contains(s.b)
                    || s.b == n && !result.contains(s.a))
          .findFirst()
          .map(s -> s.a == n ? s.b : s.a) // <- Endpunkt
          .orElse(null); // <- nichts mehr gefunden. Ende!
      if (i == null)
        break;
      result.add(next = i);
    } while (true);
    // Ergebnis ausgeben
    System.out.println(result);
  }
}
 

AshCatchem

Mitglied
Danke für die Antwort, die Lösung sieht echt Klasse aus. Ich werde versuchen, die auf meine Art und Weise in meinen Code zu integrieren, aber ich habe noch einige Fragen. 1. Hast du Tipps, wie man seine Gedanken besser in Code bekommt? Dadurch, dass ich das auf dem Papier lösen kann, weiß ich ja, worum es geht. Wie formuliert man die einzelnen Schritte am besten? Kann man das einfach, muss man das lernen oder gibt es dafür Methoden? Ich bin echt beeindruckt, dass du das so schnell aus dem Ärmel geschüttelt hast. Ich hab da gestern den ganzen Tag dran gesessen und es nicht hinbekommen. Und ich will auch nicht als Ausrede nehmen, dass ich kein Informatiker bin.
2. Gehören deine genutzten Methoden in den Werkzeugkasten eines Anfängers oder ist das eher Wissen für Fortgeschrittene? Ich sehe bei dir keine einzige Schleife mit Laufvariable. Ich hab bei einem Ansatz 3 for Schleifen genutzt. Vermutlich denke ich noch zu kompliziert, aber das spornt mich irgendwie an, mich dahingened weiterzubilden. Ich war selten so oft davor, irgendwas hinzuschmeißen wie bei dem Projekt, obwohl das an sich ja echt leicht zu sein scheint. Wie lernt man am besten, so pragmatisch zu programmieren?

Viele Grüße
 

httpdigest

Top Contributor
Hast du Tipps, wie man seine Gedanken besser in Code bekommt? Dadurch, dass ich das auf dem Papier lösen kann, weiß ich ja, worum es geht. Wie formuliert man die einzelnen Schritte am besten? Kann man das einfach, muss man das lernen oder gibt es dafür Methoden?
Du brauchst dafür ein Verständnis für grundlegende algorithmische Primitive. Im Studium beginnt man dafür meist mit Nassi-Shneidermann-Diagrammen.
Deine Aussage, du hast es auf dem Papier bereits gelöst, ist ja beliebig interpretierbar. Es kann heißen, dass du einfach nur deine Eingabeliste hingeschrieben hast und dann grafisch Pfeile vom 1. zum 2. zu verwendenden Wegpunkt, dann zum 3. und dann zum 4. gezogen hast und vielleicht noch eine Notiz "Erst das, dann das und dann den hier" geschrieben hast. Das ist natürlich noch kein Algorithmus, da es keine klar strukturierten Anweisungen enthält.
Bezüglich Methoden/Techniken, kenne ich eigentlich nur Abstraktion und Dekomposition. Google die mal.

Und ich will auch nicht als Ausrede nehmen, dass ich kein Informatiker bin.
Das wäre ehrlich gesagt aber eine sehr gute Ausrede. Ein M.Sc. Informatikstudium zum Beispiel dauert ja nicht ohne Grund mindestens 5 Jahre.

Gehören deine genutzten Methoden in den Werkzeugkasten eines Anfängers oder ist das eher Wissen für Fortgeschrittene? Ich sehe bei dir keine einzige Schleife mit Laufvariable.
Da wären wir bei dem Thema Abstraktion. In der genutzten Stream API von Java verstecken sich die Schleifen. Da eine Schleife zu sehen das Ganze meiner Meinung nach aber nur komplizierter zu verstehen macht, da man die Laufvariablen (sprich: den Zustand) hier und dort immer im Kopf haben muss, habe ich einfach eine Möglichkeit gewählt, von der tatsächlichen Iteration zu abstrahieren, damit das tatsächliche Problem erkennbar wird (nämlich das Finden des ersten Pfadsegmentes, das mit seinen Endpunkten passt). Aber ich würde sagen, solche funktionale Programmierung ist definitiv Fortgeschrittenen-Niveau.

Ich war selten so oft davor, irgendwas hinzuschmeißen wie bei dem Projekt, obwohl das an sich ja echt leicht zu sein scheint. Wie lernt man am besten, so pragmatisch zu programmieren?
Versuche dich vielleicht an einfacheren Problemen (deins war schon ein bisschen von der Sorte "für Fortgeschrittene"). Und dann einfach viiiieele viiieeele Jahre üben üben und nochmals üben.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
N ResultSet auf Einträge überprüfen Java Basics - Anfänger-Themen 5
R While-Loop der die Einträge eines Arrays in umgekehrter Reihenfolge anzeigt Java Basics - Anfänger-Themen 3
C Erste Schritte JComboBox Einträge auf Duplikat prüfen Java Basics - Anfänger-Themen 4
S CSV auf doppelte Einträge überprüfen Java Basics - Anfänger-Themen 8
K Datentypen Einträge zweier Matrizen vergleichen Java Basics - Anfänger-Themen 4
I Einträge in den Konstruktor Java Basics - Anfänger-Themen 3
S Problem: Array alle Einträge gleich Java Basics - Anfänger-Themen 10
M Erste Schritte JList einträge Java Basics - Anfänger-Themen 1
P Erste Schritte Einträge aus verschachtelter Map chronoligisch ausgeben Java Basics - Anfänger-Themen 5
C JList Einträge nach Datum sortieren Java Basics - Anfänger-Themen 3
T Einträge in jComboBox aus Liste übernehmen Java Basics - Anfänger-Themen 1
S Wie bestehende Excel-Einträge mit neuen Vergleichen (mit Apache POI)? Java Basics - Anfänger-Themen 0
E Array doppelte Einträge Java Basics - Anfänger-Themen 2
S Variablen Array in ArrayList auf doppelte Einträge überprüfen Java Basics - Anfänger-Themen 4
T Alte Einträge im Array werden von neuen überschrieben Java Basics - Anfänger-Themen 5
P Doppelte Einträge in eine List Java Basics - Anfänger-Themen 5
D Javaliste auf gleiche Einträge überprüfen Java Basics - Anfänger-Themen 2
C Doppelte Einträge aus String [] Array entfernen. Java Basics - Anfänger-Themen 5
C Datentypen Array-Einträge überhalb der Array-Länge - welcher Wert? Java Basics - Anfänger-Themen 5
L Erste Schritte Einträge in ArrayList prüfen Java Basics - Anfänger-Themen 4
M Ziffer einträge vergrößern Java Basics - Anfänger-Themen 16
H Einträge aus Array löschen Java Basics - Anfänger-Themen 8
J Markierte Einträge (Dateien) in JList sollen in einen anderen Ordner verschoben werden. Java Basics - Anfänger-Themen 12
K ArrayList.add() überschreibt vorhandene Einträge. Java Basics - Anfänger-Themen 12
M Gewisse Einträge aus einer ArrayList löschen Java Basics - Anfänger-Themen 3
M doppelte Einträge Emailempfänger... Java Basics - Anfänger-Themen 35
K ArrayList Zugreifen auf Einträge Java Basics - Anfänger-Themen 8
G txt-File als DB>doppelte Einträge verhindern/Suche/... Java Basics - Anfänger-Themen 10
B 2D-Array, gleiche Einträge prüfen Java Basics - Anfänger-Themen 5
F Hiberate-Log-Einträge Java Basics - Anfänger-Themen 2
J Datentypen List - gleiche Einträge bei neuen Objekten Java Basics - Anfänger-Themen 31
Beckenbauer OOP Durch Komma getrennte Einträge in einem String in ein Array oder eine Tabelle schreiben Java Basics - Anfänger-Themen 4
kitz Mehrere Einträge auswerfen? Java Basics - Anfänger-Themen 20
P Doppelte Einträge in mehreren Textfiles finden und ausgeben Java Basics - Anfänger-Themen 8
E Darstellung der Choice Einträge Java Basics - Anfänger-Themen 4
K Datentypen Liste: Einzelne Einträge ändern Java Basics - Anfänger-Themen 2
L Tray-Einträge und dazu passende ActionListener dynamisch erzeugen? Java Basics - Anfänger-Themen 2
J doppelte Einträge in einem Array Java Basics - Anfänger-Themen 7
M Einträge in Dateien zählen - Performance-Problem Java Basics - Anfänger-Themen 10
M Einträge in JComboBox farblich hinterlegen? Java Basics - Anfänger-Themen 2
-horn- Doppelte Einträge entfernen, aus Array, List oder sonstwas Java Basics - Anfänger-Themen 9
G _NUR_ doppelte Einträge in einem Array behalten Java Basics - Anfänger-Themen 3
B Einträge im JList einfügen Java Basics - Anfänger-Themen 9
G doppelte Einträge im String Array löschen Java Basics - Anfänger-Themen 21
V Vector/Arraylist hat nur gleiche Einträge Java Basics - Anfänger-Themen 3
0 ArrayList - doppelte Einträge entfernen? Java Basics - Anfänger-Themen 9
S Methode, um doppelte Einträge in Array zu finden Java Basics - Anfänger-Themen 5
G Wie doppelte Einträge in ComboBox vermeiden ? Java Basics - Anfänger-Themen 9
M Doppelte Einträge in einer datei löschen(nach timestamp)! Java Basics - Anfänger-Themen 4
D Doppelte Einträge einer Liste löschen Java Basics - Anfänger-Themen 6
ARadauer Alle Einträge im Startverzeichnis Java Basics - Anfänger-Themen 5
B 2 ELists vergleichen und doppelte Einträge löschen Java Basics - Anfänger-Themen 11
M einträge farblich hervorheben ? Java Basics - Anfänger-Themen 8
M Vector soll keine doppelten Einträge enthalten! Java Basics - Anfänger-Themen 5
M Einträge einer .txt-Datei in einem TextField ausgeben lassen Java Basics - Anfänger-Themen 8
J Wie kann man im Systempopup einträge machen z.B im Explorer? Java Basics - Anfänger-Themen 6
K mehrere DB Einträge in einem JTable darstellen ?HILFE! Java Basics - Anfänger-Themen 2
G Array-Listen vergleichen und Einträge löschen ? Java Basics - Anfänger-Themen 4
S JList Einträge löschen Java Basics - Anfänger-Themen 3
D Map<String, Integer> sortieren und der reinfolge nach die Glieder abfragen Java Basics - Anfänger-Themen 3
S nach Import von jars (PLC4x) in Eclipse kann nicht mehr compiliert werden Java Basics - Anfänger-Themen 9
S Java: Wie sortiere ich eine ArrayList benutzerdefinierter Objekte nach einem bestimmten Attribut? Java Basics - Anfänger-Themen 2
M Queue-Datenstruktur: nach dem Elementen entfernen, das Ergebnis ist immer noch nicht optimal. Java Basics - Anfänger-Themen 3
N Hey Leute und zwar versuche ich gerade ein 2D Spiel zu Programmieren aber die Figur will sich nicht nach links oder rechts bewegen :( Java Basics - Anfänger-Themen 12
H Liste nach String-Länge sortieren Java Basics - Anfänger-Themen 1
I Bild richtig speichern / Hochkant im File Explorer, nach Upload vertikal Java Basics - Anfänger-Themen 9
D Wie kann man in Java nach Arrays auf Duplikate prüfen Java Basics - Anfänger-Themen 12
C Probleme mit Byte konvertieren nach int Java Basics - Anfänger-Themen 10
T sortierung der eingabe nach größe Java Basics - Anfänger-Themen 5
G Bei dynamischer Arrayliste nach jeder Auswahl Zahl entfernen Java Basics - Anfänger-Themen 3
ptcho Werte/Position nach dem Funktionsaufruf tauschen? Java Basics - Anfänger-Themen 1
K Warum wird mir hier nach dem ersten Durchlauf zwei mal "welchen Datentyp wollen sie übergeben?" ausgegeben ? Java Basics - Anfänger-Themen 1
H Cast von Float nach String klappt nicht Java Basics - Anfänger-Themen 12
W LocalDate toString und nach Split falsch "erkannt"? Java Basics - Anfänger-Themen 8
B Array nach Elementwerten sortieren? Java Basics - Anfänger-Themen 1
S Größte Zahl nach Eingabe der Zahl 0 ausgeben Java Basics - Anfänger-Themen 6
I Java Mail Timeout erst nach rund 5 Minuten? Java Basics - Anfänger-Themen 9
FireHorses Einen Command erst nach einer Chateingabe aktivieren Java Basics - Anfänger-Themen 1
izoards Sortier Algorithmus für Bounding Box Elememte Links nach Rechts und von Oben nach Unten Java Basics - Anfänger-Themen 33
Jambolo Karten sortieren nach Rang und Farbe Java Basics - Anfänger-Themen 5
Lion.King Subtraktion nach Eingabe im Terminal Java Basics - Anfänger-Themen 7
D Programmieren nach UML Java Basics - Anfänger-Themen 2
rosima26 Java nach letzter Ziffer sortieren Java Basics - Anfänger-Themen 19
H Kompliziertes Sortieren einer ArrayList mit Objekten(Sortieren nach X und Y) Java Basics - Anfänger-Themen 11
H Erste Schritte Nach einer Zahl n soll n Mal der String untereinander ausgegeben werden Java Basics - Anfänger-Themen 3
volcanos List & ArrayList nach Familiennamen abfragen Java Basics - Anfänger-Themen 57
sserio Wie kann man nach einer Klasse fragen? Java Basics - Anfänger-Themen 12
S Java Client-je nach Heap Size Größe startet Applikation oder nicht Java Basics - Anfänger-Themen 4
A String split funktioniert nicht, wenn mehr als 1 Ziffer vor dem Zeichen steht nach dem er trennen soll? Java Basics - Anfänger-Themen 4
F Suche nach betreuender Person für eine Jahresarbeit der 12. Klasse. Java Basics - Anfänger-Themen 6
F nach Methode Programm nicht beenden Java Basics - Anfänger-Themen 9
E Umlaute und Sonderzeichen werden nach der Build Project nicht richtig angezeigt Java Basics - Anfänger-Themen 2
M Bei nach oben scrollen soll Seite aktualisiert werden (Userscript mit Javascript) Java Basics - Anfänger-Themen 10
K log4j nach log4j2 überführen Java Basics - Anfänger-Themen 0
javapingu Jeglichen Inhalt einer Textdatei nach Zeile n löschen Java Basics - Anfänger-Themen 8
J Nach dem Exportieren funktioniert mein Programm nicht mehr Java Basics - Anfänger-Themen 8
P Datei einlesen, nach Begriff filtern und in Datei ausgeben. Problem Standardausgabe über Konsole Java Basics - Anfänger-Themen 19
B Array nach Wert prüfen rekursiv Java Basics - Anfänger-Themen 5
CptK For-Schleife in Thread nach jedem Durchlauf pausieren Java Basics - Anfänger-Themen 35
D Primzahlen Rechner nach Eratostenes von Kyrene Algorithmus Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben