Как разделить строку до 2-го вхождения символа в Java

#java #string #function #split

#java #строка #функция #разделить

Вопрос:

У меня есть:

 1234 2345 3456 4567
 

Когда я пытаюсь String.split(" ",2) , я получаю:

 {1234} , {2345 3456 4567}
 

Но мне нужно:

 {1234},{2345}
 

Мне нужны только первые два элемента. Как мне реализовать это на Java?
Заранее спасибо.

РЕДАКТИРОВАТЬ: это всего лишь одна строка огромного набора данных.

Комментарии:

1. Как насчет разделения на каждый пробел и после взятия только первых 2 элементов результирующего массива?

2. Это было бы немного менее эффективно. Я уже подумал об этом.

3. по пространству или по времени? Иногда я предпочитаю отказываться от эффективности вместо того, чтобы изобретать weel

4. С точки зрения пробела и «кода».

Ответ №1:

Я предполагаю, что вам нужны первые две строки, затем выполните следующие действия:

     String[] res = Arrays.copyOfRange(string.split(" "), 0, 2);
 

Ответ №2:

Вы можете сделать это:-

 String[] s=string.split("");
s[2]=null;
s[3]=null;
 

Теперь у вас есть только {1234},{2345}

ИЛИ, что лучше, разделите саму строку, а затем примените split()

 String s=string.substring(string.indexOf("1"),string.indexOf("5") 1);//  1 for including the 5
s.split(" ");
 

Ответ №3:

У вас есть какие-либо варианты, один из которых — выполнить разделение и скопировать первые 2 результата.

Следующий код имеет следующий вывод:

Первые два:
1234

2345

     public static void main(String[] args) {
    String input="1234 2345 3456 4567";

    String[] parts= input.split(" ");
    String[] firstTwoEntries = Arrays.copyOf(parts, 2);

    System.out.println("First two: ");
    System.out.println("----------");
    for(String entry:firstTwoEntries){
        System.out.println(entry);
    }
    System.out.println("----------");
}
 

Другой способ — заменить исходную строку регулярным выражением и после выполнить разделение:

Результат следующего кода (мы заменяем пробел на «:»:

Отфильтровано: 1234:2345

Первые два:

1234

2345

     public static void main(String[] args) {
    String input="1234 2345 3456 4567";

    //we find first 2 and separate with :
    String filteredInput= input.replaceFirst("^([^\s]*)\s([^\s]*)\s.*$", "$1:$2");
    System.out.println("Filtered: " filteredInput);

    String[] parts= filteredInput.split(":");
    System.out.println("First two: ");
    System.out.println("--------");
    for(String part:parts){
        System.out.println(part);
    }
    System.out.println("--------");

}
 

Ответ №4:

 String input="1234 5678 9012 3456";
String[] result=Arrays.copyOf(input.split(" "),2);
 

должно работать

Ответ №5:

Самый простой (но не самый быстрый) способ — сначала разделить строку

 String test = "123 2345 3456 4567"
String[] splitted = test.split(" ");
 

и фрагмент результирующего массива:

 String[] result = Arrays.copyOfRange(splitted, 2);
 

Это будет хорошо работать в большинстве случаев. Единственная проблема может заключаться в том, что промежуточный массив становится действительно огромным. Тогда у вас будет много промежуточной памяти, которую сборщик мусора должен очистить. Но с современными оптимизациями (например, escape-анализ) даже это может не оказать большого влияния на производительность.

Ответ №6:

  1. Найдите подстроку, содержащую то, что вы хотите, вызвав indexOf дважды.
  2. Используйте split() только для этой подстроки.

Вот одно альтернативное решение, которое использует только indexOf и substring .

 public class Program{
    public static void main(String[] args) {
        String input = "1234 2345 3456 4567";
        int firstIndex = input.indexOf(" ");
        int secondIndex = input.indexOf(" ", firstIndex   1);
        String[] output = new String[] {input.substring(0, firstIndex),
            input.substring(firstIndex 1, secondIndex)};
        System.out.println(output[0]);
        System.out.println(output[1]);
    }
}
 

Вывод:

 1234
2345
 

Комментарии:

1. Я знаю, я думал об этом, но есть ли более простое решение?

2. @kaushaya, не совсем, нет. Насколько я знаю, для этого нет библиотечной функции.

3. @kaushaya, я только что добавил второе решение, которое вообще не использует string.split . Если вы заботитесь о скорости, вам, вероятно, следует сравнить это с тем, который выполняет split последующее, Arrays.copyOfRange() и использовать тот, который быстрее.

Ответ №7:

Другим однострочным решением было бы:

Предположим, у вас есть это:

 String a="1234 2343545 356 88";
 

Таким образом, однострочная команда будет:

 String b[]=a.substring(0,a.indexOf(" ",a.indexOf(" ") 1)).split(" ");
 

Теперь у вас есть «b» в виде массива из двух первых вхождений:

 b[0] //1234
b[1] //2343545