我們如何拆分陣列?例如,我有一個這樣的字符陣列:
['H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd']
現在,我想用位置 6 上可以看到的空格分割陣列。分割后的陣列將如下所示:
Array1 = ['H', 'e', 'l', 'l', 'o']
Array2 = ['W', 'o', 'r', 'l', 'd']
我確實在這里找到了類似的帖子,但它不在 java 或 Kotlin 中。
我知道我可以這樣做:
String str = TextUtils.join(",", arr);
String[] splittedString = str.split(" ");
但是,如果可能的話,我想要另一種方式。這會占用大量記憶體,并且在大型陣列上也需要大約 30-40 毫秒
如何使用 java 或 Kotlin 做到這一點
uj5u.com熱心網友回復:
一個簡單的解決方案是將原始陣列連接成一個字串,按空格分割,然后再分割成字符(在 kotlin 中):
arr.joinToString().split(" ").map{ it.split() }
這沒有優化,但仍然處于O(n)(線性復雜性)中。它受益于可讀性,這通常應該是首選,而如果這對您手頭的任務至關重要,則應該解決性能問題。
uj5u.com熱心網友回復:
用Java做它是為了好玩。雖然不是很簡潔。我似乎無法正確使用 Streams 來做到這一點。
public static void main(String[] args) {
char[] chars = {'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd'};
char[][] char2d;
String[] tokens = String.valueOf(chars).split(" ");
char2d = new char[tokens.length][];
for (int i=0; i< tokens.length; i ) {
char2d[i] = tokens[i].toCharArray();
}
for (int i=0; i< char2d.length; i ){
System.out.println(Arrays.toString(char2d[i]));
}
}
輸出:
[H, e, l, l, o]
[W, o, r, l, d]
設法用流復制它,如下所示:
char[][] char2d2 = Arrays.stream(tokens).map(String::toCharArray).toArray(char[][]::new);
for (int i=0; i< char2d2.length; i ){
System.out.println(Arrays.toString(char2d2[i]));
}
給出與上面相同的輸出。
uj5u.com熱心網友回復:
我假設一個通用陣列的元素確實具有正確的實作Object::equals;對于僅僅一個陣列char,基于 String 操作的建議解決方案是最有效的實作。
試試這個:
final Element [] input = …
final Element split = …
final List<Element[]> output = new ArrayList<>();
var start = 0;
var end = 0;
while( end < input.length )
{
if( input [end].equals( split ) )
{
output.add( Arrays.copyOfRange( input( start, end ) ) );
start = end 1;
}
end;
}
if( start < end ) output.add( Arrays.copyOfRange( input( start, end ) ) );
uj5u.com熱心網友回復:
這是一種僅使用額外的 ArrayList 和 StringBuilder 的方法,無需將整個輸入轉換為字串。
String[] splitOnSpaces(char[] chars) {
List<String> strings = new ArrayList<>();
StringBuilder word = new StringBuilder();
for (int i = 0; i < chars.length; ) {
while (i < chars.length && chars[i] == ' ') {
i;
}
while (i < chars.length && chars[i] != ' ') {
word.append(chars[i ]);
}
if (word.length() > 0) {
strings.add(word.toString());
word.setLength(0);
}
}
return strings.toArray(String[]::new);
}
if如果您允許單個陳述句與or陳述句位于同一行,則可能會更加簡潔while。
String[] splitOnSpaces(char[] chars) {
List<String> strings = new ArrayList<>();
StringBuilder word = new StringBuilder();
for (int i = 0; i < chars.length; ) {
while (i < chars.length && chars[i] == ' ') i;
while (i < chars.length && chars[i] != ' ') word.append(chars[i ]);
if (word.length() > 0) strings.add(word.toString());
word.setLength(0);
}
return strings.toArray(String[]::new);
}
uj5u.com熱心網友回復:
為什么不只是
val arr = arrayOf('H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd')
val arr1 = arr.take(5).toTypedArray()// or .joinToString()
val arr2 = arr.takeLast(5).toTypedArray()// or .joinToString()
5 是硬編碼的,但另一種方法是使用空間索引
uj5u.com熱心網友回復:
將陣列轉換為字串并在 Java 中拆分:
final String[] array = { "H", "e", "l", "l", "o", " ", "W", "o", "r", "l", "d" };
final String[] arr = String.join("", array).split(" ");
final String[] subArray1 = arr[0].split("");
final String[] subArray2 = arr[1].split("");
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/477498.html
上一篇:8個定向相機的相機切換腳本?
