我希望在java中实现一个电子表格。使用链接的单元格列(列)的链表(行)来存储数据或散列图(每个单元映射到键,例如A1 - > 1,A2-> 2等)会更好吗?
或者是否有更好的数据结构可供使用?
谢谢!
答案 0 :(得分:5)
另请查看Guava's Table并实施课程。
答案 1 :(得分:2)
使用Map
可以让您更快,更轻松地查找值。您不需要多个数据结构,单个HashMap
也可以。例如,你可以这样做: -
public class Location {
private Integer x;
private Integer y;
public Location(Integer x, Integer y) {
this.x = x;
this.y = y;
}
// implement the equals and hashcode methods
}
public class MySpreadSheet {
private Map<Location, String> spreadsheet = new HashMap<Location, String>();
public String getCellValue(Integer x, Integer y) {
return spreadsheet.get(new Location(x, y));
}
public void setCellValue(Integer x, Integer y, String value) {
spreadsheet.put(new Location(x, y), value);
}
}
答案 2 :(得分:2)
在为这些问题设计数据结构时,通过定义SpreadSheet的接口更容易开始。一旦定义了所有操作(读取操作,创建操作,修改操作和删除操作),数据结构所需的特征(顺序访问,直接访问等)将变得显而易见。
在电子表格中,人们需要使用索引/名称直接访问列,行或单元格的机制来调用Map。还需要对要调用List的行和列进行顺序访问(迭代)。所以你需要一个MapList接口。现在我们需要选择实施。由于删除可以发生在行或列列表中的任何位置,因此LinkedList实现似乎是最好的。它还允许列表重新安排的持续时间操作。总而言之, LinkedListMap 将是行和列的最佳选择。
类SpreadSheet:
LinkedListMap<String,Row> rows;
// RowKey --> Row. Row has data. This allows direct access and looping.
LinkedListMap<String,Col> cols;
//only metadata - name,sort status, visible/invisible...
//This allows direct access and looping.
class Row:
LinkedListMap<String,Cell> cells; //colKey --> cell
//This allows direct access and looping.
类Cell:
Object value;
EType dataType; //enum for data type
类Col:
String name;
ESortState sortState; //ASC, DESC, NONE
boolean visible;
从工作表访问特定单元格:
rows.get(rowKey).getValue(cells.get(colKey).getName())
使用上述数据结构,您应该能够轻松实现复杂的操作,例如获取子电子表格(矩形选择)。
答案 3 :(得分:0)
HashMap作为基础数据结构(我说基础因为您可以组合多个结构以获得最佳存储)可能是最佳解决方案。如果你需要访问其中一个单元格并且你实现了一个链表,那么需要O(n)时间来迭代列表才能到达那个单元格,而HashMap只需要O(1)时间来访问你想要的内容。对数据结构的插入和删除也是如此。
答案 4 :(得分:0)
取决于你打算用这个电子表格做什么 - 如果只进行迭代 - 然后链接列表适合,但我真的怀疑,电子表格是必须使用它。要实现对单元格的快速和可伸缩的访问,您应该将HashMap与内部哈希映射一起使用。如果您的电子表格列不是动态的,并且您完全知道它的编号,请不要忘记预设这些地图的大小。