Java 将字符串连接到";套;在爪哇
实际上,我不知道这个算法问题怎么说。我在android应用程序中有切换按钮,每个按钮对应一个编号的频道。通道是(1,n),但切换按钮ID是一些未知的、不连续的(按钮)整数。我需要收集频道号并生成一个命令字符串。基于1995年的Java技能,我得到了以下几点:Java 将字符串连接到";套;在爪哇,java,android,string,Java,Android,String,实际上,我不知道这个算法问题怎么说。我在android应用程序中有切换按钮,每个按钮对应一个编号的频道。通道是(1,n),但切换按钮ID是一些未知的、不连续的(按钮)整数。我需要收集频道号并生成一个命令字符串。基于1995年的Java技能,我得到了以下几点: String ch; int i = 1; for (ToggleButton toggle : toggles) { if (toggle.isChecked()) { ch = String.format("+%
String ch;
int i = 1;
for (ToggleButton toggle : toggles) {
if (toggle.isChecked()) {
ch = String.format("+%d", i+1);
channels = channels.concat(ch);
}
}
如果选中切换按钮1,2,4,5,6,7,11,13,21,22,23,24,25,此代码段将成功地为我提供字符串“+1+2+4+5+6+7+11+13+21+22+23+24+25”
但是,我更希望使用字符串“+1/2、+4/7、+11、+13、+21/25”
我想知道是否有比多个if语句更简单的方法:
String ch;
int it = 0;
int last = 1;
for (ToggleButton toggle : toggles ) {
if (toggle.isChecked()) {
if (it == last + 1) {
// somehow continue or note that we're only adding the "/"
} else {
// If we're not the next one, then build the last string
// of "n/last" and then add ", +" to start building next string
}
}
last++;
}
这似乎是一种蛮力类型的算法,所以我不知道Java的技巧包中是否有更优雅的解决方案(或者更可能的是,I应该有)
谢谢。您的代码不起作用,有一个最终案例问题,在一个范围结束后,您必须复制代码以进行清理(在您的数据集上尝试) 我知道您想要的是简短/简洁,但我更倾向于通过以下方式使业务逻辑代码更短、更清晰:
Counter counter=new Counter();
for(int i=1;i<=toggles.length;i++)
if(toggles.get(i).isChecked())
counter.append(i);
System.out.println(counter.getResult());
在java.util.BitSet上
我将使用表示法和跨度搜索算法。以下是基本想法():
nextSetBit
和nextClearBit
方法在查找跨度时非常方便
在StringBuilder
上,而不是使用+=/concat
StringBuilder
连接算法是标准算法。这里是重构时的情况:
StringBuilder sb = new StringBuilder();
for (Element e : elements) {
if (sb.length() > 0) sb.append(SEPARATOR);
sb.append(e);
}
你应该使用StringBuilder
或StringBuffer
而不是String
和+=
/concat
来构建长字符串。我想你的意思是1-2,4-7。。。你说的是22/25,我想你的意思是21-25。有太多模棱两可的地方了,我恐怕要换你的帖子,以防我猜错了。比尔,谢谢。21/25是正确的。然而,我的意思是1/2,4/7。然而,由于“/”和“-”一样只是一个字符串,所以它实际上并不重要。这是我正在使用的一个奇怪的telnet命令集,出于某种原因,用于多个通道的命令使用斜杠。我的意思是,在这里,它在提问时更直观。您可以在事后进行转换——或者在我的解决方案中实例化helper类时将分隔符作为参数传递给构造函数:)这有一些bug,可能仍然存在。请务必回头查看--我现在已经更新了至少3次,但我认为在这一点上它会起作用。顺便说一下,位集
有一个翻转
/“切换”方法,加上像或
(并集)和和
(交集)这样的集合操作。只有当您需要线程安全性,或者您针对的是不支持StringBuffer的Java版本(1.5之前的版本或MIDP的某些版本)时,才应使用StringBuffer。使用StringBuilder时,必须首先初始化容量,否则与字符串“+”concat相比,您在这里不会获得任何性能。
import java.util.*;
//...
BitSet bs = new BitSet();
int[] onBits = new int[] { 1,2,4,5,6,7,11,13,21,22,23,24,25 };
for (int onBit : onBits) {
bs.set(onBit);
}
System.out.println(bs);
// {1, 2, 4, 5, 6, 7, 11, 13, 21, 22, 23, 24, 25}
StringBuilder sb = new StringBuilder();
for (int begin, end = -1; (begin = bs.nextSetBit(end + 1)) != -1; ) {
end = bs.nextClearBit(begin) - 1;
if (sb.length() > 0) sb.append(", ");
sb.append(
(begin == end)
? String.format("+%d", begin)
: String.format("+%d/%d", begin, end)
);
}
System.out.println(sb);
// +1/2, +4/7, +11, +13, +21/25
StringBuilder sb = new StringBuilder();
for (Element e : elements) {
if (sb.length() > 0) sb.append(SEPARATOR);
sb.append(e);
}