给出以下功能:
如果我执行setColor("R:0,G:0,B:255,");
我希望red
,grn
,blu
值为:
0 0 255
,但我收到0 0 0
但它适用于R:255,G:0,B:0,
或R:0,G:255,B:0,
。
int setColor(String command) {
//Parse the incoming command string
//Example command R:123,G:100,B:50,
//RGB values should be between 0 to 255
int red = getColorValue(command, "R:", "G");
int grn = getColorValue(command, "G:", "B");
int blu = getColorValue(command, "B:", ",");
// Set the color of the entire Neopixel ring.
uint16_t i;
for (i = 0; i < strip.numPixels(); i++) {
strip.setPixelColor(i, strip.Color(red, grn, blu));
}
strip.show();
return 1;
}
int getColorValue(String command, String first, String second) {
int rgbValue;
String val = command.substring(command.indexOf(first)+2, command.indexOf(second));
val.trim();
rgbValue = val.toInt();
return rgbValue;
}
答案 0 :(得分:2)
在不了解您的String
实施情况的情况下,我只能做出有根据的猜测。
会发生什么是indexOf(second)
没有给你你的想法。
"R:0,G:0,B:255,"
^ ^- indexOf("B:")
|- indexOf(",")
它适用于您的其他情况,因为它们所寻找的任何内容都不会在字符串中出现过多次。
查看SparkCore Docs,我们找到了indexOf
和substring
的文档。
<强>的indexOf()强> 在另一个String中查找字符或字符串。默认情况下,从String的开头搜索,但也可以从给定索引开始,允许定位字符或String的所有实例。
string.indexOf(val)
string.indexOf(val, from)
<强>子()强>
string.substring(from)
string.substring(from, to)
现在,为了解决您的问题,您可以使用indexOf
的第二个变体,并传递您在第一次搜索时找到的索引。
int getColorValue(String command, String first, String second) {
int rgbValue;
int beg = command.indexOf(first)+2;
int end = command.indexOf(second, beg);
String val = command.substring(beg, end);
val.trim();
rgbValue = val.toInt();
return rgbValue;
}
答案 1 :(得分:1)
在这个例子中,我将使用逗号分隔字符串作为分隔符,然后将每个子字符串解析为键值对。如果你总是有序列&#34; R,G,B&#34;你可以使用第二部分的值向量。在这种情况下,为什么有&#34; R:&#34;,&#34; G:&#34;或者&#34; B:&#34;一点都没有?
答案 2 :(得分:0)
我可以假设stack nodes//create a new stack
add(nodes , startNode)//initialize the stack with the first node
while ! isEmpty(nodes)//still nodes available that haven't been processed
node p = peek(nodes)
if ! nodeInArray(p) OR getColor(p) == 1
//this node has already been visited or is not in the array
//continue with the next node in the stack
pop(nodes)
continue
color(p , 1)//mark the node as visited
push(nodes , node(x(p) - 1 , y(p))//add node to be processed in the future
...//push all other neighbours to the stack
始终会找到第一个逗号,因此对于command.indexOf(second)
,B
变为空字符串。
假设val
与.Net's类似,可以尝试
indexOf
请注意第二次调用int start = command.indexOf(first)+2;
int end = command.indexOf(second, start)
String val = command.substring(start+2, end);
的第二个参数,我认为这会使indexOf
在 indexOf
之后查找匹配。我还认为您最好为所有来电传递start
","
,并为second
添加+1或-1以补偿此次传递end
而不是","
和"G"
。
或者只使用"B"
部分的其他限制器,例如B
(点而不是逗号)。
答案 3 :(得分:0)
我最后修改了我的代码:
int setColor(String command) {
int commaIndex = command.indexOf(',');
int secondCommaIndex = command.indexOf(',', commaIndex+1);
int lastCommaIndex = command.lastIndexOf(',');
String red = command.substring(0, commaIndex);
String grn = command.substring(commaIndex+1, secondCommaIndex);
String blu = command.substring(lastCommaIndex+1);
// Set the color of the entire Neopixel ring.
uint16_t i;
for (i = 0; i < strip.numPixels(); i++) {
strip.setPixelColor(i, strip.Color(red.toInt(), grn.toInt(), blu.toInt()));
}
strip.show();
return 1;
}
我只是这样做:255,0,0
并且它可以解决问题。