Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/201.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将字符串连接到";套;在爪哇_Java_Android_String - Fatal编程技术网

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("+%

实际上,我不知道这个算法问题怎么说。我在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的技巧包中是否有更优雅的解决方案(或者更可能的是,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);
    }