我正在尝试将数据绘制到由六边形组成的网格中。因此,行长度在两个不同的值之间交替 即:网格看起来像行长4和5
0 0 0 0 0
0 0 0 0
0 0 0 0 0
0 0 0 0
有没有人知道一种聪明的方法来解决这个问题?我想过用旗帜告诉你你在哪一排,但感觉可以有一个更优雅的解决方案
答案 0 :(得分:0)
如果你要做的只是计算行长,那很简单:只需使用2的模数。
在您的示例中,假设顶行的索引为0,并且索引随着您的下降而增加。
rowLength = rowIndex % 2 == 0 ? 5 : 4;
0 % 2 == 0 --> 5
1 % 2 == 1 --> 4
2 % 2 == 0 --> 5
3 % 2 == 1 --> 4
或者,您可以让行的长度始终为5,并且在每隔一行存储一个值(例如null),表示应该跳过该值:
0 0 0 0 0
0 0 0 0 (null)
0 0 0 0 0
0 0 0 0 (null)
答案 1 :(得分:0)
一种解决方案是编写"泛型"模式生成器:
nR
。此特定模式使用2个字符。nC
和每行的字符数,请说nC
(在您的情况下, nC = 5 * 2-1 = 9 ) :将模式重复为包含此模式的一个字符串,但没有正确的换行符。nC
:在整个字符串中连续func plotGrid(numRows: Int, numCharsPerRow: Int, myPattern: String) {
let totalNumChars = numRows*numCharsPerRow
let numCharsInPattern = myPattern.characters.count
let gridTemplate = [String](count:totalNumChars/numCharsInPattern + totalNumChars%numCharsInPattern, repeatedValue: myPattern).reduce("", combine: +)
let grid = 0.stride(to: totalNumChars, by: numCharsPerRow)
.map {
i -> String in
let a = gridTemplate.startIndex.advancedBy(i)
let b = a.advancedBy(numCharsPerRow, limit: gridTemplate.endIndex)
return gridTemplate[a..<b] + "\n"
}.reduce("", combine: +)
print(grid)
}
个字符后插入换行符。这可以通过某种程度的功能来实现。方式:
plotGrid(5, numCharsPerRow: 9, myPattern: "0 ")
//0 0 0 0 0
// 0 0 0 0
//0 0 0 0 0
// 0 0 0 0
//0 0 0 0 0
plotGrid(4, numCharsPerRow: 10, myPattern: "X O ")
//X O X O X
//O X O X O
//X O X O X
//O X O X O
结果(分别为您的示例和另一个4字符模式示例)
let grid
但请注意,在let numRows = 5
let numCharsPerRow = 9
let myPattern = "0 "
let totalNumChars = numRows*numCharsPerRow
var grid = "0"
var addZero = false
for i in 2...totalNumChars {
grid += addZero ? "0" : " "
addZero = !addZero
if i%numCharsPerRow == 0 {
grid += "\n"
}
}
print(grid)
//0 0 0 0 0
// 0 0 0 0
//0 0 0 0 0
// 0 0 0 0
//0 0 0 0 0
赋值中,您创建的数组会立即减少,因此这里会产生不必要的开销,尤其是对于大型网格。下面的命令方法应该更快,但上面的,或许更整洁。
一种可能(在众多中)经典命令式方法:
;([-+]?\d*\.\d+|\d+);G