Collections Aktuellen Index generell und nach Sortierung ausgeben

Hendrik-HP

Mitglied
Hallo Forum,

als eine Art "Abschlussprüfung" für einen Lehrgang möchte ich eine Testanwendung für die Konsole schreiben. Vorbereitet habe ich eine simple Art Fahrzeugarchivierung geschrieben, in der ich diverse Fahrzeuge speichern und auch wieder ausgeben lassen möchte.

Nun habe folgendes Problem:
ich möchte bei der Ausgabe jedem Element einen Index mitgeben, welcher den aktuellen Platz in der Liste angibt. Dieser kann natürlich je nach Sortierung (nach PS) variieren. Über diesen Index möchte ich später auch die einzelnen Objekte zur Bearbeitung, Löschung, zum Klonen etc. ansprechen können. Dann üder seinen angezeigten Index -1 um den eigentlichen Speicherplatz des Elementes anzusprechen.
Ich schaffe es nur nicht, jedem Objekt seinen Index mitzugeben. Ich hatte es schon versucht, über einen expliziten Konstruktor eine statische Variable mitzugeben, nur kann ich aus der Klasse Car die LinkedList in main nicht ansprechen (!?) und auch mit einer for Schleife in der main Methode werden mir die Gesamte Plätze angezeigt, nicht der jeweilige Index.

Lange Rede gar kein Sinn:
Gewünschte Ausgabe soll wie folgt aussehen:
1 | Marke: Audi | Model: A4 | PS: 180
2 | ...

Mein Code sieht so aus:
[CODE lang="java" title="main Methode"]package com.company;

import java.util.Collections;
import java.util.LinkedList;
import java.util.Scanner;

public class Main {

public static void main(String[] args) {
//Init
Scanner sc = new Scanner(System.in);
LinkedList<Car> carLinkedList = new LinkedList<>();
int chose;

//Start
System.out.println("Fahrzeug Archiv +++TEST+++"); //einmalige Anzeige
System.out.println();

do {
//Nutzerauswahl Funktion
System.out.println("Bitte gebe deine Auswahl ein: ");
System.out.println("1 - Fahrzeugdaten eingeben und speichern");
System.out.println("2 - Fahrzeugdaten kopieren");
System.out.println("3 - Fahrzeugdaten ändern");
System.out.println("4 - Fahrzeugliste ausgeben");
System.out.println("5 - Fahrzeugliste sortieren");
System.out.println("6 - Fahrzeugdaten löschen");
System.out.println("7 - FahrzeugLISTE löschen (UNWIDERRUFLICH!");
System.out.println("8 - Fahrzeugliste importieren");
System.out.println("9 - Fahrzeugliste exportieren");
System.out.println("0 - Fahrzeugarchiv beenden");

chose = sc.nextInt();

System.out.println();

//Ausführen der Nutzerauswahl
switch(chose) {
//Fahrzeugdaten eingeben und speichern
case 1:
//Instanziierung
Car car = new Car();

//Datenübernahme
System.out.println("Bitte gebe die Marke ein: ");
String brand = sc.next();
System.out.println("Bitte gebe das Model ein: ");
String model = sc.next();
System.out.println("Bitte gebe die PS an: ");
int horsePower = sc.nextInt();

//Datenübergabe
car.setBrand(brand);
car.setModel(model);
car.setHorsePower(horsePower);

//Einfügen in die LinkedList
carLinkedList.add(car);

//Return zur Nutzerauswahl
break;

//Fahrzeugdaten kopieren
case 2:
System.out.println("Fahrzeugdaten kopieren wird demnächst hinzugefügt");
System.out.println();

//Return zur Nutzerauswahl
break;

//Fahrzeugdaten ändern
case 3:
System.out.println("Fahrzeugdaten ändern wird demnächst hinzugefügt");
System.out.println();

//Return zur Nutzerauswahl
break;

//Fahrzeugliste ausgeben
case 4:
//Ausgabe mittels foreach Schleife nach Prüfung ob Elemente enthalten sind
if( !carLinkedList.isEmpty() ) {
for(Car carVar : carLinkedList)
System.out.println(carVar);
} else {
//Ausgabe das keine Elemente enthalten sind
System.out.println("Fahrzeugarchiv ist leer!");
}
System.out.println();

//Return zur Nutzerauswahl
break;

//Fahrzeugliste Sortieren
case 5:
//sortieren mit überschriebener compareTo Methode (absteigend)
Collections.sort(carLinkedList);

//Ausgabe nach erfolgter Sortierung
System.out.println("Fahrzeugliste wurde sortiert");
System.out.println();

//Return zur Nutzerauswahl
break;

//Fahrzeugdaten löschen
case 6:
System.out.println("Fahrzeugdaten löschen wird demnächst hinzugefügt");
System.out.println();

//Return zur Nutzerauswahl
break;

//FahrzeugLISTE löschen
case 7:
//Rückfrage zur Absicherung
System.out.println("Möchtest du wirklich die GESAMTE Liste unwiderruflich löschen?");
System.out.println("0 - nein");
System.out.println("löschen - ja");

//Nutzerauswahl
String deleteConfirmation = sc.next();

//Ausführen der Nutzerauswahl
switch (deleteConfirmation) {
//Löschen der Liste abbrechen
case "0" -> {
System.out.println("Löschen abgebrochen");
System.out.println();
}
//Löschen der Liste ausführen
case "löschen" -> {
carLinkedList.clear();
System.out.println("Fahrzeugliste wurde erfolgreich gelöscht");
System.out.println();
}
}

//Return zur Nutzerabfrage
break;

//Fahrzeugliste importieren
case 8:
System.out.println("Fahrzeugliste importieren wird demnächst hinzugefügt");
System.out.println();

//Return zur Nutzerabfrage
break;

//Fahrzeugliste exportieren
case 9:
System.out.println("Fahrzeugliste exportieren wird demnächst hinzugefügt");
System.out.println();

//Return zur Nutzerabfrage
break;

//Beenden
case 0:
System.out.println("Vielen Dank für die Nutzung. Auf Wiedersehen!");

//Beenden des Programms (letzter Aufruf)
break;
}
} while(chose != 0);
}
}
[/CODE]

[CODE lang="java" title="Klasse Car"]package com.company;

public class Car implements Cloneable, Comparable {
//Attribute
private String brand;
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}

private String model;
public String getModel() {
return model;
}
public void setModel(String model) {
this.model = model;
}

private int horsePower;
public int getHorsePower() {
return horsePower;
}
public void setHorsePower(int horsePower) {
this.horsePower = horsePower;
}

public static int index;

//Konstruktor
//...

//System Methoden
@Override
public String toString() {
return index + " | Marke: " + this.getBrand() + " | Model: " + this.getModel() + " | PS: " + this.getHorsePower();
}

@Override
public boolean equals(Object obj) {
if(this == obj)
return true;
if(obj == null)
return false;
if( !(obj instanceof Car) )
return false;
Car other = (Car) obj;

if( !(this.getBrand().equals(other.getBrand())) )
return false;
if( !(this.getModel().equals(other.getModel())) )
return false;
if(this.getHorsePower() != other.getHorsePower())
return false;
return true;
}

@Override
public Car clone() {
try {
return (Car) super.clone();
} catch(CloneNotSupportedException e) {
e.printStackTrace();
}
return null;
}

@Override
public int compareTo(Object o) {
if(o instanceof Car) {
Car other = (Car) o;
if(this.getHorsePower() < other.getHorsePower())
return 1;
if(this.getHorsePower() > other.getHorsePower())
return -1;
return 0;
}return 0;
}
}
[/CODE]

Der Code sieht natürlich noch nicht sauber aus, um die Design Patterns/Optimierung kümmere ich mich später. Möchte es erstmal zum Funktionieren bekommen um mein Wissen zu verfestigen 🙂

Vielleicht hat einer von euch einen Tipp für mich?

Vielen Dank schon mal im Vorraus
Hendrik
 
ich möchte bei der Ausgabe jedem Element einen Index mitgeben, welcher den aktuellen Platz in der Liste angibt. Dieser kann natürlich je nach Sortierung (nach PS) variieren.
Du musst unterscheiden, ob Du die Position der Liste ausgeben willst (d. h. ein Fahrzeug wird in unterschiedlich sortierten Listen ggf. an unterschiedlichen Positionen auftauchen) oder für ein Fahrzeug eine feste ID haben möchtest. Letzteres könntest Du z. B. erreichen, in dem Du es als Attribut der Klasse Car mitgibst.
 
Hallo mihe7,

ich hatte geplant die erste Möglichkeit zu nutzen. Also unterschiedliche Positionen je nach Sortierung (kein fester Index pro Element sondern pro Speicherplatz). Hatte schon gedacht mit ner HashMap zu arbeiten aber dann kann Element 1 ja auch an Position 74 sein.

Aus der Sicht eines Nutzers soll angezeigt werden das ein bestimmtes Objekt im Moment an 9ter Stelle steht und über diese 9 möchte ich dann auf das Element zugreifen.

Die Nummerierungin der Liste soll also immer fest sein, die Elemente je nach Sortierung auch unterschiedlich...

Sorry aber ich kann echt schlecht erklären 🙁
 
Hab ich schon versucht.

Hab ne static variable counter in der Klasse angelegt und im Konstruktor counter++ geschrieben. Nur wurde mir dann immer die gesamten Elemente (bei 3 Elementen wurde mir bei allen eine 2 wegen 0 basiert angezeigt)
 
Nein, nur für die Ausgabe brauchst Du einen Zähler. Und static ist fast immer falsch.


In Car
Java:
    @Override
    public String toString() {
        return "Marke: " + this.getBrand() + " |  Model: " + this.getModel() + " |  PS: " + this.getHorsePower();
    }

Und bei der Ausgabe z. B.:
Java:
    int position = 1;
    for (Car car : cars) {
        System.out.printf("%d | %s\n", position, car.toString());
        position++;
    }
 
super! es klappt. Mein Code sieht jetzt so aus:

[CODE lang="java" title="Ausgabe"]//Fahrzeugliste ausgeben
case 4:
//Ausgabe mittels foreach Schleife nach Prüfung ob Elemente enthalten sind
if( !carLinkedList.isEmpty() ) {
int position = 1;
for(Car carVar: carLinkedList) {
System.out.printf("%d | %s\n", position, carVar);
position++;
}
} else {
//Ausgabe das keine Elemente enthalten sind
System.out.println("Fahrzeugarchiv ist leer!");
}
System.out.println();

//Return zur Nutzerauswahl
break;[/CODE]

jetzt bau ich auch die restlichen Funktionen ein (kopieren, löschen etc...)

Vielen Dank 🙂
 

Zurück
Oben