电子表格数据 - 链接列表或散列映射?

时间:2011-02-19 18:48:26

标签: java linked-list hashmap spreadsheet

我希望在java中实现一个电子表格。使用链接的单元格列(列)的链表(行)来存储数据或散列图(每个单元映射到键,例如A1 - > 1,A2-> 2等)会更好吗?

或者是否有更好的数据结构可供使用?

谢谢!

5 个答案:

答案 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与内部哈希映射一起使用。如果您的电子表格列不是动态的,并且您完全知道它的编号,请不要忘记预设这些地图的大小。