Java-Сравнение значений из объектов в ArrayList - PullRequest
0 голосов
/ 04 мая 2018

Таким образом, в основном у меня есть программа, в которой я добавляю компьютеры в список массивов и должен выбрать лучший из них (в зависимости от математической операции оценка / цена), то есть компьютер с оценкой 10 и ценой 5 будет лучше, чем один со счетом 10 и ценой 10. Проблема в булевом (isBetterThan) методе, который должен быть реализован и каким-то образом использован для их сравнения, и я не могу понять, как именно). Вот код на данный момент:

    package filipapp;

public interface Better {
    public double getPrice();
    public void setPrice(double price);
    public int getScore();
    public void setScore(int score);
    public boolean isBetterThan(Object obj);
}

Класс

    package filipapp;

public class Computer implements Better {
    private String model;
    private double price;
    private int score;
    public Computer (String model,double price,int score){
        this.model = model;
        this.price = price;
        this.score = score;
    }
    @Override 
    public double getPrice(){
        return price;
    }
    @Override
    public void setPrice(double price){
        this.price = price;
    }
    @Override 
    public int getScore(){
        return score;
    }
    @Override
    public void setScore(int score){
        this.score = score;
    }
    @Override 
    public boolean isBetterThan(Object obj){
        obj = getScore()/getPrice();
        return true;
    }
    @Override
    public String toString(){
        return ("Model "+model+" at price: "+price+" with score: "+score);
    }
}

GUI

 package filipapp;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;

public class FilipApp extends JFrame implements ActionListener {
    private JLabel l1,l2,l3;
    private JTextField t1,t2,t3;
    private JPanel p1,p2,p3;
    private JButton b1,b2;
    private JTextArea area;
    private JScrollPane scroll;
    public Computer p;
    ArrayList <Computer> pc = null;

    public static void main(String[] args) {
         EventQueue.invokeLater(new Runnable(){
           @Override
           public void run(){
               new FilipApp().setVisible(true);
           }
       });
    }
    public FilipApp(){
        super("The best PC");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(600,400);
        Container container = this.getContentPane();

        p1 = new JPanel();
        p1.setLayout(new GridLayout(3,2));
        l1 = new JLabel("Model",JLabel.CENTER);
        p1.add(l1);
        t1 = new JTextField(15);
        p1.add(t1);
        l2 = new JLabel("Price",JLabel.CENTER);
        p1.add(l2);
        t2 = new JTextField(15);
        p1.add(t2);
        l3 = new JLabel("Score",JLabel.CENTER);
        p1.add(l3);
        t3 = new JTextField(15);
        p1.add(t3);
        container.add(p1,BorderLayout.PAGE_START);

        p2 = new JPanel();
        b1 = new JButton("Add");
        b1.addActionListener(this);
        p2.add(b1);
        b2 = new JButton("Best");
        b2.addActionListener(this);
        p2.add(b2);
        container.add(p2,BorderLayout.CENTER);

        p3 = new JPanel();
        area = new JTextArea(15,35);
        scroll = new JScrollPane(area ,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
        p3.add(scroll);
        container.add(p3,BorderLayout.PAGE_END);

        pc = new ArrayList <>();
    }
    @Override
    public void actionPerformed(ActionEvent e){
        try{
            Object source = e.getSource();
            if (source == b1){
                p = new Computer(t1.getText(),Double.parseDouble(t2.getText()),Integer.parseInt(t3.getText()));
                pc.add(p);
                area.append("Added PC  \n"+p.toString()+"\n");
                t1.setText("");t2.setText("");t3.setText("");
            }
            else if (source == b2 && pc.isEmpty()){
                area.append("Empty List \n");
            }
            else if (source == b2){
              for (Computer element : pc){

                  element.isBetterThan(element);
                  area.append("Best PC: "+element.toString()); 
              }
            }
        }catch(NumberFormatException ex){
             System.out.println("Error in input data");
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

Ну, во-первых, если он «лучше», чем другой, субъективен, я вижу, что вы используете getScore()/getPrice() для вынесения такого суждения, поэтому я продолжу предполагать, что это хорошо.

Первое, что нужно понять, это то, что isBetterThan сравнивает this, который является Computer объектом, с другим компьютерным объектом. поэтому для запуска интерфейс должен выглядеть как

public boolean isBetterThan(Computer comp);

тогда реализация этого с использованием вашей логики деления будет выглядеть как

public boolean isBetterThan(Computer comp){
    if((this.getScore()/this.getPrice()) <
             comp.getScore()/comp.getPrice()) {
        return false;
    }
    return true;
}
0 голосов
/ 04 мая 2018

В цикле yout вы должны использовать переменную темпа, чтобы действовать как лучший элемент.

       else if (source == b2){
          Computer best = pc.get(0); // Depend on your logic, you should verify if the pc list is empty or not before get(0)
          for (int i = 1; i < pc.size(); i++){
              Computer element = pc.get(i);
              if (element.isBetterThan(best)) {
                   best = element;
              }
          }
          // When loop exits, you have access to the best pc
          area.append("Best PC: "+best.toString()); 
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...