假设我的分隔符是','(逗号),我正在寻找一个函数split
,它将保证返回的String []数组是一定的大小(不多也不少):
String[] split(String str, int limit);
split("hello", 2); => ["hello", ""]
split("hello,", 2); => ["hello", ""]
split(",hello", 2); => ["", "hello"]
split("hello,world", 2); => ["hello", "world"]
split("hello,world,goodbye", 2); => ["hello", "world,goodbye"]
看看数组大小总是2?我可以通过Pattern.split获得一些这样的行为,但不是每个案例......我怎么能这样做?
答案 0 :(得分:2)
您可以使用Arrays.copyOf()
返回填充数组。但是,填充将为null
而不是空字符串。
String[] parts = Arrays.copyOf("hello,".split(",", 2), 2);
String[] parts1 = Arrays.copyOf(",hello".split(",", 2), 2);
String[] parts2 = Arrays.copyOf("hello,world".split(",", 2), 2);
String[] parts3 = Arrays.copyOf("hello,world,goodbye".split(",", 2), 2);
String[] parts4 = Arrays.copyOf("hello,".split(",", 2), 4); //null padding
答案 1 :(得分:1)
StringUtils.split(string, separator, max)
非常接近您的需求。
然后您可以使用ArrayUtils.addAll(result, emptyArray)
,其中emptyArray
是一个大小为max - result.length
的数组。
您想要的功能太具体了,所以我怀疑会有什么随时可用的。
答案 2 :(得分:0)
我不记得所有语法,但你正在看这样的事情:
Pattern p = new Pattern("[^,]+");
String[] strings = new String[limit];
int offset = 0;
int i = 0;
for (; i < limit; i++) {
Match m = str.match(p, offset);
if (m == null) break;
offset += m.string.length + 1;
strings[i] = m.string;
}
for (; i < limit; i++) {
strings[i] = "";
}
同样,这是不有效的Java
答案 3 :(得分:0)
似乎很容易用空字符串填充新数组。这是一个可用于执行此拆分的实用程序方法。
public static String[] split(Pattern pattern, CharSequence input, int limit) {
// perform the split
tokens = pattern.split(input, limit);
int tokenCount = tokens.length();
if (tokenCount == limit) {
// if no padding is necessary, return the result of pattern.split
return tokens;
} else {
// create a new array, copy tokens into array, pad with empty string
String[] padded = Arrays.copyOf(tokens, limit);
for (int i = tokenCount; i < limit; i++) {
padded[i] = "";
}
return padded;
}
}
修改:更新为从unholysampler's answer无耻地窃取[Arrays.copyOf
] [1]。
[1]:http://download.oracle.com/javase/6/docs/api/java/util/Arrays.html#copyOf(T[],int)
答案 4 :(得分:0)
好吧,如果我理解正确你,你只想在达到通过参数提供的计数后立即停止分裂并将剩余的位完全移动到最后一个字段,对吧?另外,limit-parameter应该始终确保fieldcount?
围绕Pattern.split()方法包装方法,该方法只添加字段,直到达到限制/阈值/最小值。
for(i=0;i<limit;++i){
//add empty fields to array until limit is reached
}
答案 5 :(得分:0)
你可以用一个循环来扫描搜索分隔符的字符串,然后放入数组中不在分隔符之前的任何东西,然后重新执行它直到它达到顶部数组大小,这样它就会返回作为数组中最后一个条目的未来:
public string[] mySplit(String Split, char Delimiter, int Top)
{
string[] returned = new string[Top];
for(int i = 0; i < Top; i++){
if(i==Top)
{
returned[i] = Split; return;
}
else
{
int compPlace = 0;
char comp = Split.toCharArray()[compPlace];
while(comp != Delimiter)
{
compPlace++;
comp = Split.toCharArray()[compPlace];
}
returned[i] = Split.SubString(0,compPlace);
Split = Split.SubString(compPlace);
}
}
return returned;
}
我确定你必须调整一下,因为我现在有点头疼:)
答案 6 :(得分:0)
只需获取分隔符的位置并使用子字符串就可以轻松实现:
public static String[] split(String str, int limit){
String[] arr = new String[limit];
for(int i = 0; i < limit-1; i++){
int position = str.indexOf(',');
int length = str.length();
if(position == -1){
arr[i]= str.substring(0,length);
str = str.substring(length, length);
}
else{
arr[i] = str.substring(0, position);
str = str.substring(position+1, length);
}
}
arr[limit-1] = str;
return arr;
}