代码之家  ›  专栏  ›  技术社区  ›  sventevit

在我的示例中使用什么数据结构

  •  6
  • sventevit  · 技术社区  · 14 年前

    我想创建一个组件,它由一块板及其周围的角组成。板的大小(因此也包括边框的大小)在运行时定义。一些示例(板亮边框暗): alt text http://img340.imageshack.us/img340/3862/examplegw.png

    board由BoardCell类型的对象组成,border由BorderCell类型的对象组成。电路板的数据结构是BoardCell[,]——一个简单的二维数组。

    我怎样才能代表边界?我是这样开始的:

    public BorderCell TopLeft       // top left corner cell
    public BorderCell TopRight      // top right corner cell
    public BorderCell BottomRight   // bottom right corner cell
    public BorderCell BottomLeft    // bottom left corner cell
    public BorderCell[] Top         // top border (without corners)
    public BorderCell[] Bottom      // bottom border (without corners)
    public BorderCell[] Left        // left border (without corners)
    public BorderCell[] Right       // right border (without corners)
    

    我不喜欢这种边界表示法,你能提出更好的建议吗?

    附加:我想在border对象上设置一个方法setSomethingForceell:

    public void SetSomethingForTheCell(...)
    

    但在我目前的数据结构中,我不知道作为参数传递什么。

    6 回复  |  直到 14 年前
        1
  •  3
  •   Christian Hayter    14 年前

    因为检测一个单元格是否是边界的一部分非常简单,所以只需存储一次单元格,并在需要时测试边界成员身份。

    测试单元格是否在边框中的简单方法:

    // assuming that the array is in row-major order...
    public static bool IsInBorder(this BoardCell[,] board, int x, int y) {
        return x == board.GetLowerBound(1) || x == board.GetUpperBound(1) ||
               y == board.GetLowerBound(0) || y == board.GetUpperBound(0);
    }
    
        2
  •  2
  •   Grzenio    14 年前

    我很想为BoardCell和BorderCell(即Cell?)定义一个公共接口或基类,并将它们保存在一个(更大的)二维数组中。通过这种方式,您可以轻松地为每个单元格寻址,并且很容易确定地址是边框还是板。

        3
  •  2
  •   Ahmed    14 年前

        4
  •  2
  •   Il-Bhima    14 年前

    我已经有一段时间没用C了,所以我不能给你一个C的具体答案。但是,我希望BorderCell是BoardCell的一个子类(或者有一个公共子类)。如您所述,您的board数据结构将是BoardCell类型的2D数组。实例化电路板时,将内部单元实例化为正常的BoardCells,将边界实例化为BorderCells。

    如果您认为可能需要循环边界等,请使用yield操作符在Board类中为每种类型的循环定义一个迭代器(例如,对于角、上边界、下边界等)。

    关于你的 public void SetSomethingForTheCell(...) 相反,我将为单元元素提供一个访问器/属性。例如:

    BoardCell cell = board.getCell(i,j);
    cell.setSomething(data)
    
        5
  •  2
  •   Henk Holterman    14 年前

    如果是这种情况,您可以使用单个BaseCell[,]数组,并让Board和Border之间的区别由类类型和/或位置来定义。


    否则,将为边框创建一个小数组:`new BorderCell[2*rows+2*cols+4];

        6
  •  1
  •   Julius F    14 年前

    如上所述,您可以创建一个名为Cell(或so)的基类,并从中继承。 例如:

    BoardCell is a cell with 3 values: x, y, bool isBorder
    Board is a cell with 3 values: x, y, array Cells