【问题标题】:Split a long String into a specified size of smaller Strings将长字符串拆分为指定大小的较小字符串
【发布时间】:2017-08-12 03:43:55
【问题描述】:

我正在开发一个适用于 Android 的 SMS 应用程序,我在单个 SMS 中发送多个预定义大小的字符串。在发送端,我连接了许多预定义大小的字符串。收到短信后,我想根据大小将长字符串拆分成更小的字符串。

这是一个简单的代码来解释我的尝试:

// On the SMS sending side
String str1 = new String(new char[8]);
String str2 = new String(new char[4]);
String str3 = new String(new char[2]);
String str4 = new String(new char[2]);

String sendSMS = str1 + str2 + str3 + str4;

// send SMS

收到数据后,我想将组合的字符串分成 str1、str2、str3、str4 的数据,因为我知道每个小字符串的大小。

到目前为止,我已经找到了一些关于 SO 的答案,所有这些答案都使用 split() 函数,但是我在连接的字符串之间没有分隔字符标记。相反,我想使用每个子字符串大小的知识来获取它们。我正在寻找类似于sscanf 的东西。

【问题讨论】:

  • 那么,你的意思是你需要String.substring()
  • 我看过String.substring(),但是我有很多字符串,使用子字符串来提取每个字符串变得非常混乱。有没有办法可以将每个字符串的大小用于单个函数调用,可以将字符串拆分为较小字符串的字符串数组?正如我在问题中所说,这与 C++ 中的 sscanf 非常相似(如果存在)

标签: java android string


【解决方案1】:

这里有一些示例代码可以做你想做的事...... 但是,它不会进行错误检查,我将留给您。

String[] splitter(String input, int[] lengths)
{
    String[] output = new String[lengths.length];
    int pos = 0;
    for(int i=0;i<lengths.length;i++)
    {
        output[i] = input.substring(pos, pos+lengths[i]);
        pos = pos + lengths[i];
    }
    return output;
}

【讨论】:

  • 非常感谢!我现在以与您的问题类似的方式使用 substring 函数。不过,我也喜欢下面的“Stringbuilder”解决方案。
【解决方案2】:

您可以使用这样的解决方案:

int index = 0;
String str1= sms.substring(index, str1Length);
index += str1Length;
String str2 = and.substring(index, str2Length);
Index += str2Length:

....

您可以创建一个 Helper 类来执行此操作:

Class SmsExtractor{
     Int lastVisitedIndex = 0;
     String msg;

     Public SmsExtractor (String msg){
         This.msg=msg;
     }

    Public String extract(int length){
         String m = msg.substring(lastVisitedIndex, length);
         lastVisitedIndex += length;
         Return m;
    }
 }

并使用它:

SmsExtractor e = new SmsExtractor ( receivedMsg);
String str1 = e.extract(str1Length);
String str2 = e.extract(str2Length);

...

另一个来自 SmsExtractor 的 until 方法:

Public String[] extractAll (int[] lengths){
    String [] msgs = new String[lengths.length];
    For( int I =0; I< lengths.length; I++){
        msgs[I]= extract(lengths[I]);
    }
    Return msgs;
}

【讨论】:

    【解决方案3】:

    我的建议是使用StringBuilder。假设您从问题中获得了sendSMS,并且您想通过str4 获得str1,您可以这样做:

    StringBuilder sb = new StringBuilder(sendSMS);
    str1 = getStringFromSb(sb, 8);
    str2 = getStringFromSb(sb, 4);
    str3 = getStringFromSb(sb, 2);
    str4 = getStringFromSb(sb, 2);    
    

    还有getStringFromSb 方法:

    String getStringFromSb(StringBuilder sb, int stringLength)
    {
      String returnStr = sb.substring(0, stringLength);
      sb.delete(0, stringLength);
      return returnStr;
    }
    

    【讨论】:

    • 非常感谢!这与许多其他答案一样有效。我喜欢您的解决方案,尽管它与仅在其他答案之一中使用增量索引非常相似。
    【解决方案4】:

    如果事先知道小String的大小,就可以从大String中计算出每一个的索引。你可以使用substring(startIndex, endIndex) 函数来做到这一点。

    Here is an example

    你可以像这样在你自己的实用函数中使用这个函数

    List<String> extractSmallString(String longString, List<Integer> smallStringSize) {
        ArraysList<String> extraction = new ArrayList<>();
        int i = 0;
        for (int size : smallStringSize) {
            extraction.add(longString.substring(i, i + size);
            i += size;
        }
        return extraction
    }
    

    【讨论】:

    • 我看过String.substring(),但是我有很多字符串,使用子字符串来提取每个字符串变得非常混乱。有没有办法可以将每个字符串的大小用于单个函数调用,可以将字符串拆分为较小字符串的字符串数组?正如我在问题中所说,这与 C++ 中的 sscanf 非常相似(如果存在)
    • 你为什么不创建自己的函数,在内部使用 substring 函数并返回一个 List&lt;String&gt; 来获取小字符串大小的列表?
    【解决方案5】:

    看看this library:它是java中sscanf的一个实现:

    https://github.com/driedler/java-sscanf/tree/master/src/util/sscanf

    你也可以参考this问题。

    【讨论】:

      猜你喜欢
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多