是否有一个数组或数据类型(例如<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
)。
答案 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);
}
}