Java метод с Listiterator, чтобы вернуть все элементы в списке - PullRequest
1 голос
/ 07 апреля 2020

Я довольно новичок в этом, так что все идет.

У меня есть тренировочный отчет GUI, который отслеживает выступления спортсменов. Я изо всех сил пытаюсь написать метод findAllEntries. Предполагается go просмотреть список и вернуть все элементы, которые соответствуют определенной дате, месяцу и году, в виде строки (аналогично lookupEntry, но мне нужно, чтобы все элементы отображались в одной строке ??)

Например когда я запускаю код, он должен показывать записи Боба и Алисы, но показывает только Бобса.

Независимо от того, что я делаю, он дает мне только один элемент.

Вся помощь будет оценена!

// 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("");
 }

Ответы [ 2 ]

1 голос
/ 07 апреля 2020
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. Если строка будет пустой, это будет "результат не найден".

0 голосов
/ 07 апреля 2020

Я не уверен, что вы ожидаете, что строка будет содержать, если есть несколько записей, но вам по сути нужно повторить while l oop, который у вас уже есть в lookupEntry. Вы можете очистить код, изолировав тестовый код в частном методе, но это все.

Кроме того, в большинстве доступных версий Java вы можете использовать расширенный синтаксис for для итерации Collection тип, например:

for (Entry current: tr) {
    if (current.getDay() == d && current.getMonth() == m && current.getYear() == y)
        ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...