拆分空格分隔列表

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

the quick brown fox 

我们想要:

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

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

对于某些优雅的价值观:

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

我想不出用更少的代码来做到这一点的方法……

最优雅的可能是使用String.split来获取String[] ,然后使用Arrays.asList将其转换为List 。 如果你真的需要一个单独的列表减去头部,只需使用List.subList

  String text = "the quick brown fox"; List tokens = Arrays.asList(text.split("\\s+")); String head = tokens.get(0); List 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提供的丰富function。

也可以看看

  • Effective Java 2nd Edition,Item 25:首选列表到数组
  • Java课程/集合介绍

好吧,你得到了你想要的大部分

 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] 
 str= "the quick brown fox" pqr = str.split(" ") 

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

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

现在推荐的方法是使用String.split() 。 这将为您提供包含元素的String []。 从那里获取第一个元素并从剩余元素中创建一个数组应该是微不足道的。