如何在Java中的string数组中连接两个或更多的string?

我想将两个或更多个连续的string连接成一个数组中的一个string,根据两个variablesxy表示从x:th元素开始连接,直到我们连接了y个元素。 例如,如果数组“A”具有以下元素:

 A = {"europe", "france", "germany", "america"}; x=2;y=2; //Here, I want to concatenate france and germany as : A = {"europe", "france germany", "america"}; //Or x=2,y=3; A= {"europe", "france germany america"}; 

喜欢这个。 任何人都知道如何在没有复杂的编程的情况下做到

Solutions Collecting From Web of "如何在Java中的string数组中连接两个或更多的string?"

可能最简洁的方法是:

  1. 构build一个合适大小的数组:

     String[] result = new String[A.length - (y-1)]; 
  2. 使用System.arraycopy复制数组的开始和结束:

     System.arraycopy(A, 0, result, 0, x-1); System.arraycopy(A, x+y-1, result, x+1, A.length-(x+1)); 
  3. 构build连接string:

     result[x-1] = String.join(" ", Arrays.asList(A).subList(x-1, x-1+y)); 

(注:由于撰写date,可能出现一个错误)

这是一个工作脚本,虽然我不知道你觉得这是多么简单。 该algorithm是简单地走下input数组,将string复制到输出,直到我们到达由x值确定的第一个条目。 然后,我们连接y个词条到单个string。 最后,我们最后复制剩下的条款一个接一个。

 public static String[] concatenate(String[] input, int x, int y) { List<String> list = new ArrayList<>(); // just copy over values less than start of x range for (int i=0; i < x-1; ++i) { list.add(input[i]); } // concatenate y values into a single string StringBuilder sb = new StringBuilder(""); for (int i=0; i < y; ++i) { if (i > 0) sb.append(" "); sb.append(input[x-1+i]); } list.add(sb.toString()); // copy over remaining values for (int i=x+y-1; i < input.length; ++i) { list.add(input[i]); } String[] output = new String[list.size()]; output = list.toArray(output); return output; } String[] input = new String[] {"europe", "france", "germany", "america"}; int x = 2; int y = 3; String[] output = concatenate(input, x, y); for (String str : output) { System.out.println(str); } 

演示

这是一个非常简单的程序方法:

 private static ArrayList<String> concatenate(String[] strings, int x, int y) { ArrayList<String> retVal = new ArrayList<>(); StringBuilder builder = new StringBuilder(); int count = y; boolean concatenated = false; for (int i = 0 ; i < strings.length ; i++) { if (i < x - 1 || concatenated) { retVal.add(strings[i]); } else { builder.append(" "); builder.append(strings[i]); count--; if (count == 0) { retVal.add(builder.toString()); concatenated = true; } } } return retVal; } 

说明:

  • 对于inout数组中的每个元素:
  • 如果我们还没有到达x - 1索引或者我们已经完成连接,将元素添加到返回值中。
  • 如果我们到达了x - 1而没有完成连接,则将该元素添加到string生成器。
  • 如果我们完成连接(由count == 0表示),则将连接的string添加到返回值中。

可能与列表。

 public static void main(String[] args) { String arr []= {"europe", "france", "germany", "america"}; int from =1; int toAdd =3; int len = arr.length; if(from+toAdd>len){ //show error return ; } List<String> list = Arrays.asList(arr); List<String> concatList = list.subList(from, from+toAdd); StringBuilder sb = new StringBuilder(); for(String st: concatList){ sb.append(st).append(" "); } List<String>outList = new ArrayList<>(list.subList(0, from)); outList.add(sb.toString()); if(from+toAdd<len-1){ outList.addAll(list.subList(from+toAdd, list.size()-1)); } System.out.println(outList); } 

应该使用for循环和保持索引

 String[] A = {"europe", "france", "germany", "america"}; String[] new_Array; // your code goes here int x=2,y=3; int start_concat = x-1 ; // to account for array index int stop_concat = start_concat+y; new_Array = new String[A.length-y + 1]; for(int i=0; i<=start_concat; i++){ new_Array[i] = A[i]; } for(int i = start_concat+1 ; i<stop_concat; i++){ new_Array[start_concat] = new_Array[start_concat] + A[i]; } for(int i =start_concat+1, j=stop_concat ; i< new_Array.length;i++,j++){ new_Array[i] = A[j]; } for(int i=0; i<new_Array.length; i++){ System.out.println(new_Array[i]); } 

看我的ideone片段

使用List API,我们可以利用subList方法以及addAll方法来修改列表的特定部分,并将元素插入指定位置的列表中。

除此之外,我们使用String replace方法来移除列表的冗余string表示,并最终将累加器列表转换为string数组。

 public static String[] concatElements(String[] elements, int start, int count){ List<String> accumulator = new ArrayList<>(Arrays.asList(elements)); List<String> subList = new ArrayList<>(accumulator.subList(--start, start + count)); accumulator.removeAll(subList); String concatenatedElements = subList.toString() .replace(",", "") .replace("[","") .replace("]", ""); subList = Collections.singletonList(concatenatedElements); accumulator.addAll(start, subList); String[] resultSet = new String[accumulator.size()]; for (int i = 0; i < accumulator.size(); i++) { resultSet [i] = accumulator.get(i); } return resultSet; } 

这样调用它:

 System.out.println(Arrays.toString(concatElements(array, 2, 2))); 

会产生:

 [europe, france germany, america] 

并像这样调用它:

 System.out.println(Arrays.toString(concatElements(array, 2, 3))); 

会产生:

 [europe, france germany america] 

因为没有validation参数的startcount但是我把它作为一个练习。

要连接Android Strings ,我们可以使用TextUtils.copyOfRange()类。 剩下的我们可以用System.arraycopy()方法来避免循环:

 public static String[] concatenate(String[] input, int from, // starts from 0 position int number){ String[] res = new String[input.length - number + 1]; int to = from + number; System.arraycopy(input, 0, res, 0, from); String[] sub = Arrays.copyOfRange(input, from, to); String joined = TextUtils.join(" ", sub); res[from] = joined; System.arraycopy(input, to, res, from + 1, input.length - to); return res; } 

使用java.util.stream库的另一种方法是:

这使用IntStream.range来确定输出List的新大小,并生成表示输出序列中的索引的int s。

然后, .mapToObj用于每个输出索引,以决定在每个相应的位置放置什么(输出只有连接string的单个索引)。

输出有三种可能性 – 由getOrMergeData方法决定:

  • 在连接string的索引之前 – 使用data[index]
  • 连接string的索引之后 – 使用data[index + count - 1]
  • 在连接string的索引处 – 使用Arrays.copyOfRangestring.Join来连接需要合并在一起的string。

点击运行示例:

 class Main { public static void main(String[] args) { String [] data = {"europe", "france", "germany", "america"}; int startIndex = 1; int count = 2; int newSize = data.length - count + 1; List<String> output = IntStream.range(0, newSize) .mapToObj(n -> Main.getOrJoin(data, startIndex, count, n)) .collect(Collectors.toList()); for (String s : output) { System.out.println(s); } } private static String getOrJoin(String[] data, int joinIndex, int count, int index) { if (index < joinIndex) return data[index]; else if (index > joinIndex) return data[index + count - 1]; else { String[] dataToJoin = Arrays.copyOfRange(data, joinIndex, joinIndex + count); return String.join(" ", dataToJoin); } } } 

输出:

 europe france germany america