三角形阵列的最佳数据存储类型是什么?

时间:2011-03-14 05:49:08

标签: c# arrays multidimensional-array

是否有一个数组或数据类型(例如<List>)支持将值(特别是字符串)排列成这样的三角形...

1
2 3
4 5 6

在上面的例子中,这些数字中的每一个都包含一个字符串的2个字符的值。如果我的字符串为"Hello I am a cat",则会将其拆分为"He ll oI am ac at"

我希望我的程序将这些值存储在类似于上面三角形的数组中 - 如何实现?有没有办法让值移动(例如1=2 2=3 3=4)。

2 个答案:

答案 0 :(得分:2)

将它存储在数组中有什么问题?在典型的算术序列中,偏移都被定义(即,行#1为0,行#2为1,行#3为3等)。

那么,你将拥有的阵列:[1,2,3,4,5,6 ......]

Row #1 offset: 0;  // Base
Row #2 offset: (1) = 1;
Row #3 offset: (1 + 2) = 3;
Row #4 offset: (1 + 2 + 3) = 6;
Row #5 offset: (1 + 2 + 3 + 4) = 10;

依此类推。行n的偏移量是向n-1

添加一个

好处是,在构建这个三角形时,你可以将“添加” - 保持到数组的末尾。如果你用一些分隔符分割你的字符串,string.Split(一个数组)的输出甚至可能已经是你需要的了!

要移动/移动元素,只需在前面添加一个元素!偏移量都相同,但每个元素都会移动到下一个位置!

答案 1 :(得分:2)

存储它的最佳物理数据类型是列表或数组。但是,您可以很容易地编写一个类来抽象计算偏移量等。

public class Triangle<T> {
    private List<T> list = new List<T>();

    private int rows;
    public int Rows { get { return rows; } }

    private void CalculateRows() {
        rows = (int)Math.Ceiling(Math.Sqrt(list.Count * 2 + 0.25) - 0.5);
    }

    public void Add(T item) {
        list.Add(item);
        CalculateRows();
    }

    public T this[int column, int row] {
        get {
            if (row < 0 || row > Rows - 1) {
                throw new ArgumentOutOfRangeException("row");
            }

            if (column < 0 || column > row) {
                throw new ArgumentOutOfRangeException("column");
            }

            int rowOffset = row * (row + 1) / 2;
            return list[rowOffset + column];
        }
    }

    public int ColumnsForRow(int row) {
        if (row < 0 || row > Rows - 1) {
            throw new ArgumentOutOfRangeException("row");
        }

        if (row < Rows - 1) {
            return row + 1;
        }

        return list.Count - (row * (row + 1) / 2);
    }

    public void ShiftLeft() {
        list.Add(list[0]);
        list.RemoveAt(0);
    }

    public void ShiftRight() {
        list.Insert(0, list[list.Count - 1]);
        list.RemoveAt(list.Count - 1);
    }
}