Это - общая задача, с которой я сталкиваюсь: разделение пространства разделило список на главный элемент и массив, содержащий элементы хвоста. Например, учитывая эту строку:
the quick brown fox
Мы хотим:
"the"
["quick","brown","fox"]
.. в двух различных переменных. Первая переменная должна быть строкой и вторым массив. Я ищу изящный способ сделать это (предпочтительно в Java).
Для определенных значений of elegance:
String input = "The quick brown fox";
String[] elements = input.split(" ");
String first = elements[0];
String[] trailing = Arrays.copyOfRange(elements,1,elements.length);
Я не могу придумать способ сделать это с меньшим количеством кода ...
Используйте StringTokenizer и цикл while для перехода по каждому элементу. Внутри цикла вы можете получить первый элемент, а остальные поместить в массив.
Edit: О, я полагаю, StringTokenizer - это «устаревший» класс (хотя он все еще работает).
Теперь рекомендуется использовать String.split () . Это даст вам String [], содержащий ваши элементы. Отсюда должно быть тривиально получить первый элемент, а также создать массив из оставшихся элементов.
Наиболее элегантным, вероятно, является использование 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.
Ну, вы получите большую часть того, что хотите, с
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);
... готово.
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);
}
}
}
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 :)
Вы можете использовать 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]