2010-12-14 4 views
2

Предполагая, что мой разделитель «,» (запятая), я ищу функцию 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

Я не вижу вашу проблему, 'Pattern.split()' работает так же, как это должно , Кажется, он всегда возвращает массив размером 2 с этими вызовами. – Poindexter

+0

@Poindexter - не очень - 'split' определяет максимальное число, но будет меньше, если он найдет меньше. Джулия хочет наложить этот результат на пустые строки. – Kobi

ответ

1

StringUtils.split(string, separator, max) очень близко к тому, что вам нужно.

Тогда вы можете использовать ArrayUtils.addAll(result, emptyArray), где emptyArray - это массив размеров max - result.length.

Функциональность, которую вы хотите, слишком специфична, поэтому я сомневаюсь, что что-то будет готово к использованию.

+0

Это было самое близкое к моему окончательному решению. – Julia

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

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; 
    } 
} 

Edit: Обновление беззастенчиво воруют [Arrays.copyOf] [1] от unholysampler's answer.

[1]: http://download.oracle.com/javase/6/docs/api/java/util/Arrays.html#copyOf(T[], целое)

0

Ну, если я правильно вас понял, вы просто хотите, чтобы остановить расщепление, как только у вас есть досчитает при условии с помощью аргумента и переместить остальные немного целиком в последний поле, правильно? Кроме того, предельный параметр должен всегда обеспечивать полевой счет?

Оберните метод вокруг метода Pattern.split(), который просто добавляет поля до достижения предела/порога/минимума.

for(i=0;i<limit;++i){ 
//add empty fields to array until limit is reached 
} 
не
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; 
} 

Я уверен, что вы будете иметь, чтобы настроить это как у меня есть немного головной боли, как сейчас :)

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 
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; 
     } 
Смежные вопросы