如何覆盖HashSet的getValueAt?

时间:2016-03-13 19:26:21

标签: java swing hashset abstracttablemodel

我需要扩展AbstractTableModel来表示表中的一些数据。我有一个类Car,它应代表表中的一个项目(行):

public class Car implements Comparable<Car> {
    public String make;
    public int year;
    public double engineVol;
    public double maxSpeed;

    // ...getters/setters for the fields...


    public Car (String make, int year, double engineVol, double maxSpeed) {
        this.make = make;
        this.year = year;
        this.engineVol = engineVol;
        this.maxSpeed = maxSpeed;

    }

    @Override
    public boolean equals(Object other) {
        if (this == other) return true;
        if (other == null || getClass() != other.getClass()) return false;

        Car car = (Car) other;

        if (year != car.year) return false;
        if (Double.compare(car.engineVol, engineVol) != 0) return false;
        if (Double.compare(car.maxSpeed, maxSpeed) != 0) return false;
        return make.equals(car.make);
    }

    @Override
    public int hashCode() {
        int result;
        long temp;
        result = make.hashCode();
        result = 31 * result + year;
        temp = Double.doubleToLongBits(engineVol);
        result = 31 * result + (int) (temp ^ (temp >>> 32));
        temp = Double.doubleToLongBits(maxSpeed);
        result = 31 * result + (int) (temp ^ (temp >>> 32));
        return result;
    }

    @Override
    public int compareTo(Car other) {
        return this.make.compareTo(other.make);
    }
}

这些Car个对象存储在HashSet中,CarTableModel位于public class CarTableModel extends AbstractTableModel { private static final long serialVersionUID = 7927259757559420606L; private HashSet<Car> cars; public CarTableModel(HashSet<Car> cars) { this.cars = cars; } @Override public int getRowCount() { return cars.size(); } @Override public int getColumnCount() { return 4; } @Override public Object getValueAt(int rowIndex, int columnIndex) { return null; } }

import Tkinter as tk
import tkFont

class Display():

    def __init__(self, parent):
        self.parent = parent

        self._geom = '200x200+0+0'
        parent.geometry("{0}x{1}+0+0".format(parent.winfo_screenwidth(), parent.winfo_screenheight()))
        parent.overrideredirect(1)

        parent.title('My App')
        parent.configure(background='#000000')
        parent.displayFont = tkFont.Font(family="Helvetica", size=150)

        self.messageString="Hello"
        self.message = tk.Message(self, text=self.messageString, bg="#000000", font=parent.displayFont, fg="#777777", justify="c")
        self.message.place(relx=.5, rely=.5, anchor="c")


def main(): 
    root = tk.Tk()
    window = Display(root)
    root.mainloop()

if __name__ == '__main__':
    main()

据我所知,我需要在AbstractTableModel中覆盖至少3个方法。如何为HashSet覆盖getValueAt?关于HashSet的那些rowIndex和columnIndex参数是什么?如果我们无法通过索引获取值,那么这些indeces如何应用于HashSet?它有可能吗?

P.S。在这里使用HashSet并不是我的随意,它是大学的任务,所以它必须这样。

4 个答案:

答案 0 :(得分:2)

  

如何为HashSet覆盖getValueAt?

不要使用HashSet。您通常会使用ArrayList,因此按照将它们添加到List中的顺序定义行。

例如,查看Table Row Model,其中介绍了创建自定义模型的过程。它还提供了一个通用的TableModel,以便在您希望的过程中简化该过程。

  

在这里使用HashSet并不是我的任性,这是一项大学任务,所以必须采用这种方式。

错过了评论。我不知道为什么你需要使用HashSet,因为没有直接的方法来访问数据。因此,在我看来,每次需要行时都需要遍历Set。效率不高。

答案 1 :(得分:1)

您可以尝试使用LinkedHashSet。但目前还不清楚如何将columnIndexCar一起使用。

也许,来自番石榴的ArrayTable会帮助你。

答案 2 :(得分:1)

您必须知道,即使您考虑使用Iterator来获取HashSet的第n个值,订单也是未定义的。

此处,来自JavaDoc

  

它不保证集合的迭代顺序;在   特别是,它不保证订单将保持不变   随着时间的推移。

但是,如果你真的必须使用这个集合,这里是getValueAt

的实现
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
    Optional<Car> tmpCar = cars.stream()
                               .skip(rowIndex) // Assuming your rows begin with 0
                               .findFirst();
    return tmpCar.isPresent() ? tmpCar : null;
}

答案 3 :(得分:0)

因此,如果您必须使用HashSet,则可以执行以下操作:

@Override
public Object getValueAt(int rowIndex, int columnIndex) {
    Car car = null;
    int = 0;
    for (Car c : cars) {
        if (i == rowIndex) {
            car = c;
            break;
        }
        i++;
    }
    if (car == null) // handle this situation with your rules
        return "";

    return car.get<Field as described in your columns>; //
}

请记住,订单无法保证。然后测试很多。