簡體   English   中英

Java 方法與 Listiterator 返回列表中的所有元素

[英]Java method with Listiterator to return all elements in a list

我對此很陌生,所以就這樣。

我有一個跟蹤運動員表現的訓練記錄 GUI。 我正在努力編寫 findAllEntries 方法。 它應該通過列表 go 並將與特定日期、月份和年份匹配的所有元素作為字符串返回(類似於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("");
 }
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. 如果字符串為空,則為“未找到結果”。

如果有多個條目,我不確定您希望字符串包含什么,但您基本上需要重復您在lookupEntry中已有的while循環。 您可以通過在私有方法中隔離測試代碼來清理代碼,但僅此而已。

此外,在 Java 的大多數可用版本中,您可以使用擴展for語法來迭代Collection類型,例如:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM