[英]Using a LinkedList And ListIterator to return elements in alphabetical order
[英]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
我們使用 StringBuilder 而不是字符串,這樣它會占用更少的空間,並且每次找到新條目時我們都會附加字符串。
如果字符串為空,則為“未找到結果”。
如果有多個條目,我不確定您希望字符串包含什么,但您基本上需要重復您在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.