【问题标题】:Java method with Listiterator to return all elements in a list使用 Listiterator 的 Java 方法返回列表中的所有元素
【发布时间】:2020-07-19 19:24:07
【问题描述】:

我对此很陌生,所以就这样吧。

我有一个跟踪运动员表现的训练记录 GUI。 我正在努力编写 findAllEntries 方法。它应该遍历列表并将与特定日期、月份和年份匹配的所有元素作为字符串返回(类似于lookupEntry,但我需要将所有元素显示在一个字符串中??)

例如,当我运行代码时,它应该显示 Bob 和 Alice 条目,但它只显示 Bobs。

无论我做什么,它只给我一个元素。

我们将不胜感激!

// An implementation of a Training Record as an ArrayList

import java.util.*;

public class TrainingRecord {
    private List<Entry> tr;

    public TrainingRecord() {
        tr = new ArrayList<Entry>();
    } // constructor

    // add a record to the list
    public void addEntry(Entry e) {
        tr.add(e);
    } // addClass

    // look up the entry of a given day and month
    public String lookupEntry(int d, int m, int y) {
        ListIterator<Entry> iter = tr.listIterator();
        String result = "No entries found";
        while (iter.hasNext()) {
            Entry current = iter.next();
            if (current.getDay() == d && current.getMonth() == m && current.getYear() == y)
                result = current.getEntry();
        }
        return result;
    } // lookupEntry

    public String findAllEntries(int d, int m, int y) {

        // I am stuck here
        String result = "No entries found";
        return result;
    } // findAllEntries
}
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import java.lang.Number;

public class TrainingRecordGUI extends JFrame implements ActionListener {
private JTextField name = new JTextField(30);
private JTextField day = new JTextField(2);
private JTextField month = new JTextField(2);
private JTextField year = new JTextField(4);
private JTextField hours = new JTextField(2);
private JTextField mins = new JTextField(2);
private JTextField secs = new JTextField(2);
private JTextField dist = new JTextField(4);
private JLabel labn = new JLabel(" Name:");
private JLabel labd = new JLabel(" Day:");
private JLabel labm = new JLabel(" Month:");
private JLabel laby = new JLabel(" Year:");
private JLabel labh = new JLabel(" Hours:");
private JLabel labmm = new JLabel(" Mins:");
private JLabel labs = new JLabel(" Secs:");
private JLabel labdist = new JLabel(" Distance (km):");
private JButton addR = new JButton("Add");
private JButton lookupR = new JButton("Look Up");
private JButton findAllByDate = new JButton("Find All");
private TrainingRecord myAthletes = new TrainingRecord();

private JTextArea outputArea = new JTextArea(5, 50);

public static void main(String[] args) {
    TrainingRecordGUI applic = new TrainingRecordGUI();
} // main

// set up the GUI
public TrainingRecordGUI() {
    super("Training Record");
    setLayout(new FlowLayout());
    add(labn);
    add(name);
    name.setEditable(true);
    add(labd);
    add(day);
    day.setEditable(true);
    add(labm);
    add(month);
    month.setEditable(true);
    add(laby);
    add(year);
    year.setEditable(true);
    add(labh);
    add(hours);
    hours.setEditable(true);
    add(labmm);
    add(mins);
    mins.setEditable(true);
    add(labs);
    add(secs);
    secs.setEditable(true);
    add(labdist);
    add(dist);
    dist.setEditable(true);
    add(addR);
    addR.addActionListener(this);
    add(lookupR);
    lookupR.addActionListener(this);
    add(outputArea);
    add(findAllByDate);
    findAllByDate.addActionListener(this);
    add(outputArea);
    outputArea.setEditable(false);
    setSize(720, 200);
    setVisible(true);
    blankDisplay();

    // test cases)
    Entry a = new Entry("Alice", 1, 2, 2003, 0, 16, 7, 3);
    Entry b = new Entry("Bob", 1, 2, 2003, 0, 14, 15, 3);
    Entry c1 = new Entry("Claire", 7, 3, 2010, 0, 26, 20, 7);
    Entry c2 = new Entry("Claire", 11, 3, 2010, 0, 24, 55, 7);
    myAthletes.addEntry(a);
    myAthletes.addEntry(b);
    myAthletes.addEntry(c1);
    myAthletes.addEntry(c2);
} // constructor

// listen for and respond to GUI events
public void actionPerformed(ActionEvent event) {
    if (event.getSource() == addR) {
        String n = name.getText();
        int m = Integer.parseInt(month.getText());
        int d = Integer.parseInt(day.getText());
        int y = Integer.parseInt(year.getText());
        float km = java.lang.Float.parseFloat(dist.getText());
        int h = Integer.parseInt(hours.getText());
        int mm = Integer.parseInt(mins.getText());
        int s = Integer.parseInt(secs.getText());
        Entry e = new Entry(n, d, m, y, h, mm, s, km);
        myAthletes.addEntry(e);
        outputArea.setText("Record added\n");
    }
    if (event.getSource() == lookupR) {
        int m = Integer.parseInt(month.getText());
        int d = Integer.parseInt(day.getText());
        int y = Integer.parseInt(year.getText());
        outputArea.setText("looking up record ...");
        String result = myAthletes.lookupEntry(d, m, y);
        outputArea.setText(result);
    }
    if (event.getSource() == findAllByDate) {
        int m = Integer.parseInt(month.getText());
        int d = Integer.parseInt(day.getText());
        int y = Integer.parseInt(year.getText());
        outputArea.setText("looking up record ...");
        String result = myAthletes.findAllEntries(d, m, y);
        outputArea.setText(result);
    }

    blankDisplay();
} // actionPerformed

public void blankDisplay() {
    name.setText("");
    day.setText("");
    month.setText("");
    year.setText("");
    hours.setText("");
    mins.setText("");
    secs.setText("");
    dist.setText("");
 }

【问题讨论】:

  • 你可以试试这个而不是 if (current.getDay() == d && current.getMonth() == m && current.getYear() == y) result = result.concat(current .getEntry());如果这是您所期望的,这将在结果字符串中包含所有条目。
  • 感谢您的回答。不幸的是,它仍然只返回第一个元素...

标签: java arraylist methods iterator


【解决方案1】:
public String lookupEntry(int d, int m, int y) {
    ListIterator<Entry> iter = tr.listIterator();
    StringBuilder result=new StringBuilder(""); //1
    while (iter.hasNext()) {
        Entry current = iter.next();
        if (current.getDay() == d && current.getMonth() == m && current.getYear() == y)
            result.append(current.getEntry()+" ");
    }
   //2
    if(result.equals("")){
        result.append("No entires found");
    }
    return result.toString();
} // lookupEntry
  1. 我们使用 StringBuilder 而不是字符串,这样它会占用更少的空间,并且每次找到新条目时我们都会附加字符串。

  2. 如果字符串为空,则为“未找到结果”。

【讨论】:

    【解决方案2】:

    如果有多个条目,我不确定您希望字符串包含什么,但您基本上需要重复您在lookupEntry 中已有的while 循环。您可以通过在私有方法中隔离测试代码来清理代码,但仅此而已。

    此外,在大多数可用的 Java 版本中,您可以使用扩展的 for 语法来迭代 Collection 类型,例如:

    for (Entry current: tr) {
        if (current.getDay() == d && current.getMonth() == m && current.getYear() == y)
            ...
    }
    

    【讨论】:

    • 嘿,谢谢您的回答。我已经尝试过了,但仍然无法正常工作。 A 已添加到 GUI 中,我在其中放置了一些测试用例。因此,当我在 2003 年 1 月 2 日尝试此方法时,我希望它将 Alice 和 Bob 条目作为一个字符串返回?
    • 您能否详细说明(在您的原始问题中)出了什么问题或您遇到问题的部分?从lookupEntry 代码中可以明显看出,您确实知道如何迭代和查找条目。是字符串连接有问题吗?
    猜你喜欢
    • 2022-10-14
    • 2021-09-21
    • 1970-01-01
    • 2022-01-25
    • 2012-10-30
    • 1970-01-01
    • 1970-01-01
    • 2016-09-26
    • 1970-01-01
    相关资源
    最近更新 更多