Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用什么容器来保持索引自动更新?_Java_Swing_Collections_Indexing_Tablemodel - Fatal编程技术网

Java 使用什么容器来保持索引自动更新?

Java 使用什么容器来保持索引自动更新?,java,swing,collections,indexing,tablemodel,Java,Swing,Collections,Indexing,Tablemodel,以下情况:我需要一个包含rowindex数据的容器。目前,我们在tablemodels中使用普通的ArrayList并手动更新TableRowNumber(使用疯狂的算法,在添加、删除和移动容器中的数据后保持更新) 在发现更新这些表行的第三个错误后,我考虑最终使用另一个容器来自动更新这些表行。我的第一个想法是使用LinkedList。我唯一不喜欢的是,在LinkedList中,我无法在不删除/读取项目的情况下移动项目,但似乎仍然令人满意 Rowheader本身是一个自己的表,需要针对每个事件进行

以下情况:我需要一个包含rowindex数据的容器。目前,我们在tablemodels中使用普通的ArrayList并手动更新TableRowNumber(使用疯狂的算法,在添加、删除和移动容器中的数据后保持更新)

在发现更新这些表行的第三个错误后,我考虑最终使用另一个容器来自动更新这些表行。我的第一个想法是使用LinkedList。我唯一不喜欢的是,在LinkedList中,我无法在不删除/读取项目的情况下移动项目,但似乎仍然令人满意

Rowheader本身是一个自己的表,需要针对每个事件进行更新,以使两者保持同步

我只是想知道,你是否可以推荐其他选择。所以我很好奇你会用什么样的容器

谢谢,
ymene

我不确定我是否完全理解这个问题。但是,假设您有一个
列表,并且您需要一个显示行号、人名和人名的表格,那么您不需要在person中甚至在列表中使用任何索引即可:

public class PersonTableModel extends AbstractTableModel {

    private List<Person> persons;

    public int getRowCount() {
        return persons.size();
    }

    public int getColumnCount() {
        return 3;
    }

    public Object getValueAt(int row, int col) {
        if (col == 0) {
            return row + 1;
        }
        else if (col == 1) {
            return persons.get(row).getFirstName();
        }
        else {
            return persons.get(row).getLastName();
        }
    }
    ...
}
公共类PersonTableModel扩展了AbstractTableModel{
私人名单人员;
public int getRowCount(){
返回人。大小();
}
public int getColumnCount(){
返回3;
}
公共对象getValueAt(整数行,整数列){
如果(列==0){
返回行+1;
}
else if(col==1){
返回persons.get(row.getFirstName();
}
否则{
返回persons.get(row.getLastName();
}
}
...
}

ArrayList要比LinkedList高效得多,因为对于LinkedList,索引访问是O(1)而不是O(n)。

不太清楚在这种情况下为什么需要疯狂的算法。基于
列表创建
表格模型并保持它们同步听起来相当简单(如果您有一个触发事件的
列表
,或另一个钩子来检测
列表中的更改
)也许我有点夸大了这些算法。我只是认为使用一个已经有索引的容器可能会更容易。我们确实有一个触发这些事件的列表。因此,您可以采用经典的方式,通过接收这些事件来更新行标题以保持它们的同步?您使用的是
DefaultTableModel
还是
AbstractTableModel
?我注意到我的问题似乎没有真正指出我的目标,对此表示抱歉。表本身已经很好(我认为),但我有一个额外的表用于tablerowheader(出于显示原因,如滚动),我需要为用户显示。这也是标题,移动操作通过拖放完成。我通常必须同步这两个表。所以我的问题都是关于如何组织这些表的行号。我添加了一张图片,希望能比我更好地解释这一点。您的行标题表模型应该听由主表模型激发的事件,并根据主表模型的新行数调整其内容。但我不明白除了行数以外的任何内容都应该更改。其getValueAt()方法应该与我的答案中的方法类似,用于索引0处的列。