当前位置: 首页 > 知识库问答 >
问题:

如何为HashSet重写getValueAt?

红鸿运
2023-03-14

我需要扩展AbstractTableModel来表示表中的一些数据。我有一个类< code>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;
    }
}

就我所知,我需要在AbstractTableModel中覆盖至少3个方法。如何为HashSet重写getValueAt?关于HashSet的rowIndex和columnIndex参数是什么?如果我们不能通过一个索引从一个哈希表中获取值,那么这些索引是如何应用到哈希表的呢?这可能吗?

附言:在这里使用HashSet不是我的任性,这是大学的作业,所以必须这样做。

共有3个答案

顾恺
2023-03-14

您必须知道,即使您考虑使用迭代器来获取哈希集的第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;
}
聂奇
2023-03-14

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

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

公良浩邈
2023-03-14

如何为HashSet重写getValueAt?

不要使用散列表。您通常会使用ArrayList,以便按照将行添加到列表中的顺序来定义行。

例如,检查表格行模型,该模型将完成创建定制模型的过程。如果您愿意,它还提供了一个通用的表模型来简化这个过程。

在这里使用HashSet不是我的任性,这是大学的作业,所以它必须这样。

错过了那个评论。我不知道为什么需要您使用HashSet,因为没有直接的方法来访问数据。所以在我看来,每次需要一行时,您都需要遍历Set。不是很有效。

 类似资料:
  • 本文向大家介绍HashSet如何检查重复相关面试题,主要包含被问及HashSet如何检查重复时的应答技巧和注意事项,需要的朋友参考一下 当你把对象加入时,HashSet会先计算对象的值来判断对象加入的位置,同时也会与其他加入的对象的hashcode值作比较,如果没有相符的hashcode,HashSet会假设对象没有重复出现。但是如果发现有相同hashcode值的对象,这时会调用方法来检查hash

  • 我正在检查< code>HashSet的< code>add方法。有人提到 如果该集合已经包含元素,则调用保持集合不变,并返回false。 但是方法在内部保存中的值 的方法声明 将指定值与该映射中的指定键相关联。如果映射先前包含该键的映射,则旧值将被替换。 那么,如果 的 方法替换了旧值,那么 方法如何在元素重复的情况下保持集合不变?

  • } ========================================================================================== 我希望HashSet调用equal方法,因为重写了hashCode。在equals compare之后,我想删除我要传递到hashSet的集合中的重复项。 在控制台中,它将我打印出来,为true(因为在equals

  • 该程序将两个元素都添加到Set中。起初我很震惊,因为在向set添加方法时,调用了equals方法。 但是后来我覆盖了hashCode方法: 然后它没有添加。这是令人惊讶的,因为Set和add()方法的Javadoc表示,它在向集合中添加时只检查equals()。 这是add()的javadoc: 然后我意识到HashSet被实现为一个HashMap,在这个map中,对象的hashCode被用作键。

  • 我下载了gatling作为maven依赖项,现在我正在寻找如何重写gatling.conf文件来配置gatling和Graphite之间的连接。 因此,我创建了一个Gatling.conf文件,如下所示: 干杯。

  • 问题内容: 我似乎无法使实例正常工作。我使用的代码如下: 子类 该代码输出 问题答案: 您需要覆盖。而不是这样做,您实现了一个带有signature 的方法。因此,您使用的是为相等性测试定义的默认方法。 默认实现基于对象标识,因此,该集合“允许”您添加两个在语义上相等的不同对象。