Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
JavaFXPrüfen ob ein Objekt sich mehrmals in einer Liste befindet
ich versuche gerade eine TableView mit Objektwerten zu füllen, was auch momentan klappt.
Ich möchte das selektierte Objekt in eine ListView transportieren. Diese Funktion klappt auch.
Nun möchte ich prüfen, ob sich das Objekt noch ein weiteres mal in der ListView befindet.
Meine momentane Methode prüft leider nur das letzte hinzugefügte Element und nicht die komplette Liste.
Ich finde dazu auch nur die contains-Methode. Wie kann ich anderweitig prüfen, ob sich das gleiche Objekt mehrmals in der Liste befindet?
Java:
public boolean checkIfExist(List<Land> listViewList, Land l)
{
if (listViewList != null && listViewList.contains(l))
{
return true;
}
else
{
return false;
}
}
Die contains Methode ist schon richtig, allerdings gibt es Hilfsklassen, welche deine Arbeit erleichtern (intern greifen deren Methoden auch auf "contains" zu).
Erstelle ein Set. Wenn du nur wissen willst, ob irgendein Objekt öfter als ein mal vorkommt, dann füge einfach die gesamte Liste dem Set hinzu und prüfe im Anschluss die Länge der Liste und des Sets. Falls dies der Fall ist, wird das Set kürzer sein.
Wenn du wissen willst, welches Element doppelt oder öfters vorhanden ist, dann füge die Elemente der Liste einzeln dem Set hinzu und prüfe, ob der Rückgabewert "true" ist. Ist er "false", so war das Element schon im Set vorhanden und ist somit doppelt oder öfters in der Liste vorhanden.
Wenn du wissen willst, welches Element wie oft vorhanden ist, dann musst du mit einer Map arbeiten.
Auch wenn ich equals überschreibe, will es nicht funktionieren.
Ich stelle euch mal die gesamte Klasse zur Verfügung.
Vielleicht ist es besser nachzuvollziehen wie ich die gesamte Aufgabe gelöst habe.
Ich programmiere mit dem MVP-Pattern (ähnlich zu MVC).
[CODE lang="java" title="Objekt-Klasse"]public class Land
{
private SimpleIntegerProperty vorwahl;
private SimpleStringProperty land;
private SimpleStringProperty stadt;
private SimpleDoubleProperty einwohner;
private SimpleDoubleProperty flache;
public Land(int v, String l, String e, double einw, double f)
{
this.vorwahl = new SimpleIntegerProperty(v);
this.land = new SimpleStringProperty(l);
this.stadt = new SimpleStringProperty(e);
this.einwohner = new SimpleDoubleProperty(einw);
this.flache = new SimpleDoubleProperty(f);
}
public SimpleIntegerProperty getVorwahl()
{
return vorwahl;
}
public SimpleStringProperty getLand()
{
return land;
}
public SimpleStringProperty getStadt()
{
return stadt;
}
public SimpleDoubleProperty getEinwohner()
{
return einwohner;
}
public SimpleDoubleProperty getFlache()
{
return flache;
}
public int hashCode()
{
return land.hashCode();
}
@Override
public boolean equals(Object o)
{
if (o instanceof Land)
{
Land l = (Land) o;
return this.land.equals(l.getLand());
}
else
return false;
}
public void addLand(Land l)
{
m.addLand(l);
v.getItemToTable(l);
}
public void removeLand(Land l)
{
m.removeLand(l);
v.removeFromTable(l);
m.check(l);
v.removeFromListView(l);
}
public void pushingList(Land l)
{
m.schieben(l);
v.getPushingListToList(l);
}
public void checkifExcist(Land l)
{
if (m.getPushingList() != null && m.getPushingList().contains(l))
{
Alert a = new Alert(AlertType.WARNING);
a.setContentText("Land bereits vorhanden");
a.setHeaderText("Warnung");
a.showAndWait();
}
else
{
pushingList(l);
}
}
}
[/CODE]
In der View-Klasse habe ich ein Button, weches die Methode zum Prüfen der Liste triggert.
Java:
public void getItemsToList(Land l)
{
l = table.getSelectionModel().getSelectedItem();
p.checkifExcist(l);
}
[CODE=java]public class View
{
private Presenter p;
private BorderPane pane;
private TableView<Land> table;
private ListView<Land> list;
private Button schieben;
private Stage addStage;
private Button addButton;
private Button removeButton;
private HBox h;
public View(Presenter p)
{
this.p = p;
init();
}
public void init()
{
pane = new BorderPane();
table = new TableView<Land>();
list = new ListView<Land>();
schieben = new Button("=>");
schieben.setAlignment(Pos.CENTER);
addButton = new Button("Land hinzufügen");
removeButton = new Button("Land entfernen");
h = new HBox();
createColumns();
schieben.setOnAction(e ->
{
getItemsToList(table.getSelectionModel().getSelectedItem());
});
addButton.setOnAction(e -> addStage(Modality.APPLICATION_MODAL));
removeButton.setOnAction(e -> removeLand());
getItemsToTable();
h.getChildren().addAll(addButton, removeButton);
h.setSpacing(5);
h.setPadding(new Insets(10));
pane.setLeft(table);
pane.setRight(list);
pane.setCenter(schieben);
pane.setBottom(h);
}
public void createColumns()
{
TableColumn<Land, Number> vorwahlColumn = new TableColumn<Land, Number>("Vorwahl");
TableColumn<Land, String> landColumn = new TableColumn<Land, String>("Land");
TableColumn<Land, String> stadtColumn = new TableColumn<Land, String>("Stadt");
TableColumn<Land, Number> einwohnerColumn = new TableColumn<Land, Number>("Einwohner");
TableColumn<Land, Number> flacheColumn = new TableColumn<Land, Number>("Fläche");
vorwahlColumn.setCellValueFactory(item -> item.getValue().getVorwahl());
landColumn.setCellValueFactory(item -> item.getValue().getLand());
stadtColumn.setCellValueFactory(item -> item.getValue().getStadt());
einwohnerColumn.setCellValueFactory(item -> item.getValue().getEinwohner());
flacheColumn.setCellValueFactory(item -> item.getValue().getFlache());
table.getColumns().addAll(vorwahlColumn, landColumn, stadtColumn, einwohnerColumn, flacheColumn);
}
public void getItemsToTable()
{
table.getItems().setAll(p.getObsList());
}
public void getItemsToList(Land l)
{
l = table.getSelectionModel().getSelectedItem();
p.checkifExcist(l);
}
public void getPushingListToList(Land l)
{
list.getItems().addAll(l);
}
public void getItemToTable(Land l)
{
table.getItems().addAll(l);
}
public void removeLand()
{
Land l = table.getSelectionModel().getSelectedItem();
p.removeLand(l);
}
public void removeFromTable(Land l)
{
table.getItems().remove(l);
}
public void removeFromListView(Land l)
{
list.getItems().remove(l);
}
public BorderPane getPane()
{
return pane;
}
// Stage hinzufügen
public void addStage(Modality modal)
{
addStage = new Stage();
Scene scene = addStage();
addStage.setScene(scene);
addStage.setTitle("Land hinzufügen");
addStage.show();
}
public Scene addStage()
{
GridPane grid = new GridPane();
Label vorwahl = new Label("Vorwahl");
Label land = new Label("Land");
Label stadt = new Label("Stadt");
Label einwohner = new Label("Einwohner");
Label flache = new Label("Fläche");
TextField textv = new TextField();
TextField textl = new TextField();
TextField texts = new TextField();
TextField texte = new TextField();
TextField textf = new TextField();
Button add = new Button("Hinzufügen");
add.setOnAction(e ->
{
Land l = new Land(Integer.valueOf(textv.getText()), textl.getText(), texts.getText(), Double.valueOf(texte.getText()), Double.valueOf(textf.getText()));
p.addLand(l);
textv.clear();
textl.clear();
texts.clear();
texte.clear();
textf.clear();
addStage.close();
});
grid.addRow(0, vorwahl, textv);
grid.addRow(1, land, textl);
grid.addRow(2, stadt, texts);
grid.addRow(3, einwohner, texte);
grid.addRow(4, flache, textf);
grid.addRow(5, new Label(), add);
grid.setAlignment(Pos.CENTER);
grid.setPadding(new Insets(10, 10, 10, 10));
grid.setVgap(5);
return new Scene(grid, 450, 250);
}
}
Java:
public class Main extends Application
{
@Override
public void start(Stage stage) throws Exception
{
Model m = new Model();
Presenter p = new Presenter(m);
View v = new View(p);
v.init();
p.setView(v);
stage.setScene(new Scene(v.getPane(), 850, 450));
stage.setTitle("VorwahlListe");
stage.show();
}
public static void main(String[] args)
{
launch();
}
}
Ich habe es mit einer weiteren HashMap ausprobiert und das hat auch geklappt.
Im Model habe ich die Liste pushingList in eine eigene HashMap hinzugefügt und habe die Objekte die doppelt in der HashMap vorkommen mit contains verglichen.