拆分空格分隔列表

时间:2010-07-09 15:17:40

标签: java string

这是我面临的一项常见任务:将空格分隔列表拆分为 head 元素和包含 tail 元素的数组。例如,给定此字符串:

the quick brown fox

我们希望:

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

..在两个不同的变量中。第一个变量应该是一个字符串,第二个变量应该是一个数组。我正在寻找一种优雅方式(最好用Java)。

8 个答案:

答案 0 :(得分:27)

对于某些优雅的值:

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

我想不出用更少的代码来做这件事的方法......

答案 1 :(得分:7)

最优雅的可能是使用String.split来获取String[],然后使用Arrays.asList将其变为List<String>。如果你真的需要一个单独的列表减去头部,只需使用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"

使用List可以利用Java Collections Framework提供的丰富功能。

另见

答案 2 :(得分:1)

嗯,你得到了大部分你想要的东西

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

...进行。

答案 3 :(得分:1)

你可以利用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]

答案 4 :(得分:1)

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

    }
}

答案 5 :(得分: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中会更容易:)

答案 6 :(得分:0)

使用StringTokenizer和while循环逐步浏览每个元素。在循环内部,您可以获取第一个元素并将其余元素放入数组中。

编辑:哦,我猜StringTokenizer是一个“遗产”类(尽管它仍然有效)。

现在推荐使用String.split()。那会给你一个包含元素的String []。从那里获取第一个元素并从剩余元素中创建一个数组应该是微不足道的。

答案 7 :(得分:0)

str= "the quick brown fox"
  pqr = str.split(" ")