如何在具有多个字符串的数组列表中搜索对象并返回对象?

Posted

技术标签:

【中文标题】如何在具有多个字符串的数组列表中搜索对象并返回对象?【英文标题】:How to search for an object in an arraylist with multiple strings and return opbject? 【发布时间】:2021-04-27 17:13:35 【问题描述】:

下午好,

我是编码新手,我需要一些帮助 我创建了一个名为 alHup 的对象的 Arraylist。 alHup 包含名为“Company”的对象。

private ArrayList<Company> alHup = new ArrayList();

公司存在String ID、String Companytype、String year、String Region、String Class、int Size、int Profit和int Area。

我创建了一个单独的类来定义公司。


package aaadblok1.landbouwapp.View;


public class Company 
 private String Companytype, Year, Region, Class;
 private Integer Size, Profit, Area;
 

 
public Company()
    


    public String getYear() 
        return Year;
    

    public void setYear(String Year) 
        this.Year = Year;
    

    public Integer getSize() 
        return Size;
    

    public void setSize(Integer Size) 
        this.Size = Size;
    

    public Integer getArea() 
        return Area;
    

    public void setArea(Integer Area) 
        this.Area = Area;
    

    public Integer getProfit() 
        return totaalopbrengst;
    

    public void setProfit(Integer Profit) 
        this.Profit = Profit;
    

    public String getID() 
        return ID;
    

    public void setID(String ID) 
        this.ID = ID;
    

    public String getClass() 
        return Class;
    

    public void setClass(String Class) 
        this.Class = Class;
    

    public String getCompanytype() 
        return Companytype;
    

    public void setCompanytype(String Companytype) 
        this.Companytype = Companytype;
    

    public String getRegion() 
        return Region;
    

    public void setRegion(String Region) 
        this.Region = Region;
    

我为 String Companytype、String Year、String Region 和 String Class 创建了 4 个文本字段。 我希望能够在 Arraylist 中搜索包含 4 个文本字段中的值的单个对象,并返回该对象的 int Size、int Profit 和 int Area。我想在 3 个 TextField 中显示 int Size、int Profit 和 Int Area。

txtCompanytype= new TextField();
txtClass= new TextField();
txtRegion= new TextField();
txtYear= new TextField();
txtProfit = new TextField();
txtSize = new TextField();
txtArea= new TextField();

我为此创建了一个名为“搜索”的按钮。但我不知道按钮的 lambda 表达式应该是什么样子。

Search= new Button("Search");

有没有朋友可以帮我解决这个问题。提前谢谢你。

现在我的班级是这样的

package aaadblok1.landbouwapp;

import aaadblok1.landbouwapp.View.Bedrijfsgroep;
import java.util.ArrayList;
import java.util.Optional;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.control.Alert;
import javafx.scene.control.Button;
import javafx.scene.control.ComboBox;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.Pane;

/**
 *
 * @author potat
 */
public class OverzichtScherm 
 private Label Bedrijftype33, SoKlasse, Regio, Jaar, Totaalopbrengst, Omvang, Oppervlaktecultuurgrond;
 private TextField txtBedrijfstype, txtSoKlasse, txtRegio, txtTotaalopbrengst, txtOmvang, txtOppervlaktecultuurgrond;
 private Button Zoeken, Uitloggen, nh, zh, ut, nb, ze, li, ge , ov, fl, fr, gr, dr, klasse1, klasse2, klasse3, klasse4, klasse5, klasse6, klasse7, klasse8, Groep1, Groep2, Groep3, Groep4, Groep5;
 private GridPane Scherm;
 private  ArrayList<Bedrijfsgroep> alHup = new ArrayList();
 private DataCollector dc = new DataCollector();
 
 public OverzichtScherm(Pane root)
     
 // maken van labels en tekstvelden
 
 Bedrijftype33= new Label("Bedrijfstype:");
 SoKlasse= new Label("So-Klasse:");
 Regio=new Label("Regio:");
Jaar= new Label("Jaar:");
Totaalopbrengst= new Label("Totaal Opbengst:");
Omvang= new Label("Omvang:");
Oppervlaktecultuurgrond= new Label("Oppervlakte Cultuurgrond:");
txtBedrijfstype= new TextField();
txtSoKlasse= new TextField();
txtRegio= new TextField();
txtTotaalopbrengst = new TextField();
txtOmvang = new TextField();
txtOppervlaktecultuurgrond= new TextField();



Scherm= new GridPane();
Scherm.setAlignment(Pos.CENTER);
Scherm.setHgap(10);
Scherm.setVgap(10);
Scherm.setMinSize(30, 30);
Scherm.setPadding(new Insets(10, 10, 10, 10)); 

//Het maken van de buttons

Zoeken= new Button("Zoeken");
Uitloggen= new Button("Uitloggen");
nh= new Button();
zh= new Button();
ut=new Button();
nb= new Button();
ze= new Button();
li= new Button();
ge= new Button();
ov = new Button();
fl= new Button();
fr= new Button();
gr= new Button();
dr= new Button();
klasse1 = new Button("3.000 tot 25.000 euro");
klasse2= new Button("25.000 tot 100.000 euro");
klasse3= new Button("100.000 tot 250.000 euro");
klasse4= new Button("250.000 tot 500.000 euro");
klasse5= new Button("500.000 tot 1.000.000 euro");
klasse6= new Button("1.000.000 tot 1.500.000 euro");
klasse7=new Button("1.500.000 tot 3.000.000 euro");
klasse8= new Button("meer als 3.000.000 euro");
Groep1=new Button("Akkerbouw");
Groep2=new Button("Tuinbouw");
Groep3=new Button("Blijvende Teelt");
Groep4= new Button("Graasdieren");
Groep5= new Button("Hokdieren");

// bepaalde tekstvlakken niet bewerkbaar zetten (voor gebruiksvriendelijkheid en veiligheid).

txtBedrijfstype.setEditable(false);
txtSoKlasse.setEditable(false);
txtRegio.setEditable(false);
txtTotaalopbrengst.setEditable(false);
txtOppervlaktecultuurgrond.setEditable(false);
txtOmvang.setEditable(false);

//Combobox voor de jaartallen

ComboBox jaartal = new ComboBox();
jaartal.getItems().add("2000JJ00");
 jaartal.getItems().add("2001JJ00");
 jaartal.getItems().add("2002JJ00");
 jaartal.getItems().add("2003JJ00");
 jaartal.getItems().add("2004JJ00");
 jaartal.getItems().add("2005JJ00");
 jaartal.getItems().add("2006JJ00");
 jaartal.getItems().add("2007JJ00");
 jaartal.getItems().add("2008JJ00");
 jaartal.getItems().add("2009JJ00");
 jaartal.getItems().add("20010JJ00");
 jaartal.getItems().add("2011JJ00");
 jaartal.getItems().add("2012JJ00");
 jaartal.getItems().add("2013JJ00");
 jaartal.getItems().add("2014JJ00");
 jaartal.getItems().add("2015JJ00");
 jaartal.getItems().add("2016JJ00");
 jaartal.getItems().add("2017JJ00");
 jaartal.getItems().add("2018JJ00");
 jaartal.getItems().add("2019JJ00");
 jaartal.getItems().add("2020JJ00");



//knoppen programmeren provincies zodat ze de het textvak invullen

nh.setOnAction(event -> txtRegio.setText("PV27"););
zh.setOnAction(event -> txtRegio.setText("PV28"););
ut.setOnAction(event -> txtRegio.setText("pv26"););
nb.setOnAction(event -> txtRegio.setText("PV30"););
ze.setOnAction(event -> txtRegio.setText("PV29"););
li.setOnAction(event -> txtRegio.setText("PV31"););
ge.setOnAction(event -> txtRegio.setText("PV25"););
ov.setOnAction(event -> txtRegio.setText("PV23"););
fl.setOnAction(event -> txtRegio.setText("PV24"););
fr.setOnAction(event -> txtRegio.setText("PV20"););
gr.setOnAction(event -> txtRegio.setText("PV21"););
dr.setOnAction(event -> txtRegio.setText("PV22"););

// knoppen programmeren soklasse zodat het textvak juist wordt ingevuld

klasse1.setOnAction(event -> txtSoKlasse.setText("A029006"););
klasse2.setOnAction(event -> txtSoKlasse.setText("A029007"););
klasse3.setOnAction(event -> txtSoKlasse.setText("A029008"););
klasse4.setOnAction(event -> txtSoKlasse.setText("A029009"););
klasse5.setOnAction(event -> txtSoKlasse.setText("A029010"););
klasse6.setOnAction(event -> txtSoKlasse.setText("A029011"););
klasse7.setOnAction(event -> txtSoKlasse.setText("A029012"););
klasse8.setOnAction(event -> txtSoKlasse.setText("A029013"););

// knoppen programmeren bedrijfstypen
Groep1.setOnAction(event -> txtBedrijfstype.setText("A009481"););
Groep2.setOnAction(event -> txtBedrijfstype.setText("A009487"););
Groep3.setOnAction(event -> txtBedrijfstype.setText("A009497"););
Groep4.setOnAction(event -> txtBedrijfstype.setText("A009501"););
Groep5.setOnAction(event -> txtBedrijfstype.setText("A009510"););

// uitlogknop programmeren, met loguitboodschap
Uitloggen.setOnAction(event ->
        Alert Loguit = new Alert (Alert.AlertType.INFORMATION);
                Loguit.setTitle("Uitloggen");
                Loguit.setHeaderText("Bedankt en tot ziens!");
                Loguit.showAndWait(); 
                root.getChildren().clear();
                        new LogIn (root);  );

//zoeken knop programmeren zodat de juiste zoektermen worden ingevuld
 ArrayList<Bedrijfsgroep> alHup = dc.getBedrijfsgroep();

Zoeken.setOnAction(event ->

 );






// Alles op Gridpane zetten en op root


// zoekvakken

Scherm.add(Bedrijftype33, 0,3);
Scherm.add(txtBedrijfstype,1,3);
Scherm.add(SoKlasse, 0,4);
Scherm.add(txtSoKlasse, 1, 4);
Scherm.add(Regio, 0, 5);
Scherm.add(txtRegio, 1, 5);
Scherm.add(Jaar, 0, 6);
Scherm.add(jaartal,1,6);
Scherm.add(Zoeken,1,7);

//UItkomstvakken

Scherm.add(Omvang, 0,10);
Scherm.add(txtOmvang,1,10);
Scherm.add(Oppervlaktecultuurgrond, 0,11);
Scherm.add(txtOppervlaktecultuurgrond, 1, 11);
Scherm.add(Totaalopbrengst, 0,12);
Scherm.add(txtTotaalopbrengst, 1, 12);
Scherm.add(Uitloggen, 1, 13);

//provincies

Scherm.add(nh, 6,3);
Scherm.add(zh, 6,4);
Scherm.add(ut, 6,5);
Scherm.add(nb, 6,6);
Scherm.add(ze, 6,7);
Scherm.add(li, 6,8);
Scherm.add(ge, 6,9);
Scherm.add(ov, 6,10);
Scherm.add(fl, 6,11);
Scherm.add(fr, 6,12);
Scherm.add(gr, 6,13);
Scherm.add(dr, 6,14);

//soklassen

Scherm.add(klasse1, 9,3);
Scherm.add(klasse2, 9,4);
Scherm.add(klasse3, 9,5);
Scherm.add(klasse4, 9,6);
Scherm.add(klasse5, 9,7);
Scherm.add(klasse6, 9,8);
Scherm.add(klasse7, 9,9);
Scherm.add(klasse8, 9,10);

//Bedrijfstypen

Scherm.add(Groep1, 12,3);
Scherm.add(Groep2, 12,4);
Scherm.add(Groep3, 12,5);
Scherm.add(Groep4, 12,6);
Scherm.add(Groep5, 12,7);


root.getChildren().add(Scherm);


     
 
 
 
    

【问题讨论】:

首先,请用英文写下你的代号,这样我们就知道这些变量是什么意思了,接下来你说你创建了4个textfields,但是在你的代码中有6个,所以也是您只比较 4 个 textfield 变量还是比较所有 6 个变量? 你能澄清Stringstextfields吗? Jaar 似乎没有 textfield 对不起 AP11 和保罗。我已经编辑了原始帖子以将字符串和 TextFields 翻译成英文。 您能发布您的Company 代码吗? 我已经发布了公司类 AP11 【参考方案1】:

如果你能提供你的整个代码,给你正确的答案会更容易,但无论如何我会使用过滤器,我的 lambda 看起来像这样:

Optional<Company> result = alHup.stream().filter(company -> company.getCompanyType() == txtCompanytype.getText())
                .filter(company -> company.getYear() == txtYear.getText())
                .filter(company -> company.getRegion() == txtRegion.getText())
                .filter(company -> company.getCompanyClass() == txtClass.getText())
                .findFirst();
 if (result.isPresent()) 
     Company company = result.get();
 

【讨论】:

您好 AP11,我已经尝试过您的解决方案,但他说 company.getYear()、company.getRegion() 和 company.getCompanyClass 不起作用。 NetBeans 在类中找不到符号 那是因为我没有你的代码,所以我希望你有某种getters,如果你知道的话,它们是什么。您必须重命名它们以适合您的代码。

以上是关于如何在具有多个字符串的数组列表中搜索对象并返回对象?的主要内容,如果未能解决你的问题,请参考以下文章

如何进行查询以返回包含列表中所有 id 的对象

在循环中创建多个具有不同名称的对象以存储在数组列表中

MongoDB:使用子代数组填充父代vs通过父代ID搜索子代

javascript - 如果在子对象中找到值,则搜索嵌套对象数组并返回父对象[重复]

如何构建和查询 Room DB 以返回多个类的对象列表?

在核心数据中搜索所有具有空“对多”关系的对象