Разделение пространства разделило список

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

the quick brown fox

Мы хотим:

"the"
["quick","brown","fox"]

.. в двух различных переменных. Первая переменная должна быть строкой и вторым массив. Я ищу изящный способ сделать это (предпочтительно в Java).

10
задан Wram 9 July 2010 в 16:12
поделиться

8 ответов

Для определенных значений of elegance:

String input = "The quick brown fox";
String[] elements = input.split(" ");
String first = elements[0];
String[] trailing = Arrays.copyOfRange(elements,1,elements.length);

Я не могу придумать способ сделать это с меньшим количеством кода ...

27
ответ дан 3 December 2019 в 14:00
поделиться
str= "the quick brown fox"
  pqr = str.split(" ")
0
ответ дан 3 December 2019 в 14:00
поделиться

Используйте StringTokenizer и цикл while для перехода по каждому элементу. Внутри цикла вы можете получить первый элемент, а остальные поместить в массив.

Edit: О, я полагаю, StringTokenizer - это «устаревший» класс (хотя он все еще работает).

Теперь рекомендуется использовать String.split () . Это даст вам String [], содержащий ваши элементы. Отсюда должно быть тривиально получить первый элемент, а также создать массив из оставшихся элементов.

0
ответ дан 3 December 2019 в 14:00
поделиться

Наиболее элегантным, вероятно, является использование String.split для получения String [] , а затем использование Arrays.asList для преобразования его в ] Список . Если вам действительно нужен отдельный список без заголовка, просто используйте List.subList .

    String text = "the quick brown fox";
    List<String> tokens = Arrays.asList(text.split("\\s+"));

    String head = tokens.get(0);
    List<String> body = tokens.subList(1, tokens.size());

    System.out.println(head); // "the"
    System.out.println(body); // "[quick, brown, fox]"

    System.out.println(body.contains("fox")); // "true"
    System.out.println(body.contains("chicken")); // "false"

Использование списка позволяет вам воспользоваться преимуществами разнообразных функций, предоставляемых Java Collections Framework.

См. Также

7
ответ дан 3 December 2019 в 14:00
поделиться

Ну, вы получите большую часть того, что хотите, с

String[] pieces = "how now brown cow".split("\\s") 

или около того. Ваш результат будет массивом строк.

Если вы действительно хотите, чтобы первый элемент был отделен от остальных, вы можете сделать что-то вроде:

String head = pieces[0];
String[] tail = new String[pieces.length - 1];
System.arraycopy(pieces, 1, tail, 0, tail.length);

... готово.

1
ответ дан 3 December 2019 в 14:00
поделиться
package playground;

import junit.framework.TestCase;

public class TokenizerTest extends TestCase {

    public void testTokenize() throws Exception {
        String s = "the quick brown fox";
        MyThing t = new MyThing(s);
        assertEquals("the", t.head);
        String[] rest = {"quick", "brown", "fox"};
        assertEqualArrays(rest, t.rest);
    }

    private static void assertEqualArrays(String[] a, String[] b) {
        assertEquals(a.length, b.length);
        for (int i = 0; i < a.length; i++) 
            assertEquals(a[i], b[i]);
    }

    private static class MyThing {
        private final String head;
        private final String[] rest;

        public MyThing(String s) {
            String[] array = s.split(" ");
            head = array[0];
            rest = new String[array.length - 1];
            System.arraycopy(array, 1, rest, 0, array.length - 1);
        }

    }
}
1
ответ дан 3 December 2019 в 14:00
поделиться
public static void main(String[] args) {
        String s = "the quick brown fox";
        int indexOf = s.indexOf(' ');
        String head = s.substring(0, indexOf);
        String[] tail = s.substring(indexOf + 1).split(" +");
        System.out.println(head + " : " + Arrays.asList(tail));
    }

Было бы намного проще на Haskell :)

1
ответ дан 3 December 2019 в 14:00
поделиться

Вы можете использовать String # split () , принимая ограничение в качестве второго аргумента.

String text = "the quick brown fox";
String[] parts = text.split(" ", 2);
String headPart = parts[0];
String[] bodyParts = parts[1].split(" ");

System.out.println(headPart); // the
System.out.println(Arrays.toString(bodyParts)); // [quick, brown, fox]
1
ответ дан 3 December 2019 в 14:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: