分配行和列

时间:2015-12-21 20:06:45

标签: swift graph plot

我正在尝试将数据绘制到由六边形组成的网格中。因此,行长度在两个不同的值之间交替 即:网格看起来像行长4和5

0 0 0 0 0
 0 0 0 0 
0 0 0 0 0 
 0 0 0 0

有没有人知道一种聪明的方法来解决这个问题?我想过用旗帜告诉你你在哪一排,但感觉可以有一个更优雅的解决方案

2 个答案:

答案 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