【问题标题】:How to Insert string to a particular index in string array and shifting strings after that?如何将字符串插入字符串数组中的特定索引并在此之后移动字符串?
【发布时间】:2016-07-13 18:32:06
【问题描述】:

我有如下代码

String singlestr="hello|world|how|are|you";
String[] arraystr = singlestr.split("|");

结果我有 =>

arraystr[0]=hello
arraystr[1]=world
arraystr[2]=how
arraystr[3]=are
arraystr[4]=you

现在的问题是如何在第三个位置插入一个新字符串?有什么功能吗?

将新字符串插入索引 2 后的预期输出:

arraystr[0]=hello
arraystr[1]=world
arraystr[2]=hi
arraystr[3]=how
arraystr[4]=are
arraystr[5]=you

【问题讨论】:

  • 数组有限制,比如你只能分配单一类型的数据,应该声明长度,你不能在运行时更改长度,所以最好使用 list 或 arraylist 之类的集合,它会解决你的问题和它比像这样的简单数组有优势

标签: java android arrays string


【解决方案1】:

尝试使用 StringBuilder。使用 append() 方法从 arrayStr 插入元素,然后使用 insert() 在所需位置插入新文本。 toString() 方法将返回完成的字符串。

我的示例代码假定您知道新文本的确切插入点。更通用的方法是使用 indexOf() 方法获取插入点后文本的偏移量,然后在调用 insert() 时使用该索引作为偏移量参数。此外,您的示例将初始字符串拆分为没有嵌入分隔符的单独单词。 toString() 将返回“helloworldhihowareyou”。如果您想在结果字符串中分隔单词,请在将 arrayStr 的每个元素添加到 StringBuilder 对象之前附加一个空格字符(或其他分隔符?)。

String singlestr="hello|world|how|are|you";
String[] arraystr = singlestr.split("|");
StringBuilder builder = new StringBuilder ();
String newString;

for (String s: arraystr) {
    builder.append(s.concat(" "));  // Add with separator
}

builder.insert(10,"hi");
newString = builder.toString();

【讨论】:

    【解决方案2】:

    字符串数组不能增加它们的大小。如果要添加到它,则需要实例化一个全新的数组,然后将值从初始数组复制到新的字符串数组。

    例子:

    在这个例子中,我们使用 for 循环遍历所有索引并将它们分配给新数组,但是当我们到达所需的索引时,我们正在分配一个新值,从而“转移”其他值新数组。

    String[] first = {"hello", "world", "how", "are", "you"};
    String[] second = new String[5];
    
    for(int i = 0; i < first.length; i++){
        if(i != 2){
             second[i] = first[i];
        }else{
             second[2] = "hi";
        }
    }
    
    for(String s: second){
            System.out.println(s);
    }
    

    超级丑不?

    我建议改用 ArrayList 或 List。 Arraylists 能够增加它们的长度而不需要对初始数组做任何特殊的事情。你可以简单地说 add(index, value)。

    例子:

    ArrayList<String> values = new ArrayList<>();
    values.add("hello");
    values.add("world");
    values.add("how");
    values.add("are");
    values.add("you");
    values.add(2,"Hi"); //adding to index 2!
    

    现在,如果出于某种原因您确实需要一个常规的旧数组,那么只需将您的 arraylist 转换回一个数组就非常容易了。

    String[] newVal = new String[5];
    values.toArray(newVal);
    

    【讨论】:

    • 好的,这似乎很有帮助。感谢你的付出。之后我会检查并接受答案。非常感谢@basic :)
    • @jdoe 不用担心,这就是 SO 的用途 :)
    【解决方案3】:

    您需要将元素复制到一个新的、稍大的数组中。 System.arraycopy() 可能是最有效的方法:

    String singlestr="hello|world|how|are|you";
    String[] arraystr = singlestr.split("\\|"); // Note: pipe needs to be regex-escaped
    String[] newarray = new String[arraystr.length + 1];
    System.arraycopy(arraystr, 0, newarray, 0, 2);
    newarray[2] = "hi";
    System.arraycopy(arraystr, 2, newarray, 3, arraystr.length - 2);
    

    【讨论】:

      【解决方案4】:

      编辑:合并代码段并删除多余的谈话。 :)

      我的第一个建议是在插入元素之前将数据存储在 LinkedList 中。该类有一个 add(index, value) 类型的方法,它完全符合您的要求。例如,

      LinkedList<String> list = new LinkedList(arraystr);
      list.add(2,"hi");
      

      如果你必须在最后有一个数组,那么你可以使用链表来保存你的数据,然后使用 toArray() 方法将其转换回(到一个新的更大的数组)

      String[] newArray = list.toArray();
      

      如果您甚至不允许使用 LinkedList 来保存您的数据,我认为除了在某种循环中将所有后来的值向下移动一个等级,然后在创建的空间中添加您的值之外,别无选择。但是正如其他人指出的那样,您不能增加数组的大小。因此,除非您的阵列有额外的空间(在您的情况下没有),否则无论如何您都需要创建一个新的更大的阵列。在这种情况下,您最好使用 List 实现之一。

      【讨论】:

        【解决方案5】:

        我知道它很旧,但我在几分钟前发现了这个,我所做的是:

        for (int i=textrray.size(); i>2; i--) {
            textarray.set(i-1,textarray.get(i-2));
        }
        textarray.set(1, textarray.get(0));
        textarray.set(0, "new content at array position 1"); 
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-01-20
          • 2020-07-28
          • 2011-05-17
          • 2011-10-19
          相关资源
          最近更新 更多