在Java中将字符串连接到“集合”

时间:2010-08-10 16:58:36

标签: java android string

实际上,不确定如何说出这个算法问题。我在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 应该有)

感谢。

2 个答案:

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

nextSetBitnextClearBit方法在查找范围时非常方便。


使用StringBuilder

String代替+=/concat

StringBuilder加入算法是标准算法。这是重构的时候:

    StringBuilder sb = new StringBuilder();
    for (Element e : elements) {
        if (sb.length() > 0) sb.append(SEPARATOR);
        sb.append(e);
    }

您应该使用StringBuilderStringBuffer代替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;