实际上,不确定如何说出这个算法问题。我在Android应用程序中切换按钮,每个按钮对应一个带编号的频道。通道是(1,n)但是切换按钮id是一些未知的,无序的(对按钮)整数。我需要收集频道号并构建一个命令字符串。我基于1995年的Java技能给了我这个:
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是否有一个更优雅的解决方案,Java可能有它的一些技巧(或者,更可能的是, I 应该有)
感谢。
答案 0 :(得分:1)
java.util.BitSet
我将java.util.BitSet
用于表示和跨度搜索算法。这是基本想法(see on ideone.com):
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
nextSetBit
和nextClearBit
方法在查找范围时非常方便。
StringBuilder
String
代替+=/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 :(得分:0)
你的工作不起作用,有一个最终案例问题,你必须复制你的代码,以便在一个范围结束后进行清理(在你的数据集上试试)
我知道您正在寻找简短/简洁,但我倾向于通过这样的方式使 业务逻辑代码 更短更清洁:
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());
因此您的代码部分更短,但您需要一个新类。这个类是可重用的,任何时候你想重新创建相同类型的范围列表,你已经得到它!代码的两个部分都应该更容易理解,因为每个代码都只是自己的工作。这是一个更长的时间,但说实话,我不是任何方式,形状或形式的粉丝。只要你是干的,越明显越好。
PS。我今天要打架了。
所以:
public class counter
int a=-1;
int b=-1;
String result="";
public append(int i)
if(a == -1)
a=i;
b=i;
else if(b == i-1)
b++;
else
finished();
public finished()
if(result.length != 0 && a != -1)
result+="+";
if(a != -1)
result.append(a);
if(a != b)
result.append("/"+b);
a=-1;
b=-1;
public String getResult()
finished();
return result;