从arrayList到long []

时间:2009-11-08 14:59:36

标签: java arrays collections

我正在做一个需要返回long []的方法。它看起来像这样:

public long[] parseString(String input)

输入是如下字符串:

  • 1,3,4
  • 10,30,40,50

在parseString中我使用正则表达式获取所有数字并将它们添加到ArrayList中,因为我不知道它会找到多少次发生。

最后,我创建一个long [],其大小与arrayList相同,并为每个执行一次,将其添加到long [] var。

另一种方式是: 首先使用

计算每次出现的次数
while ( matcher.find() ) size++;

然后使用size创建一个大小的long []并执行: matcher.reset()现在将long值保存在long []变量中。

您认为哪种方式最好?

有更好的方法吗?

请记住,我无法更改方法签名:(

7 个答案:

答案 0 :(得分:12)

冒着被Google's guava-libraries作为一个巨大的皮条客的风险(我真的很喜欢它!),Longs类使这个成为一个单行:

return Longs.toArray(foundLongs);

TA-DAA!

答案 1 :(得分:5)

由于Java中基元和对象之间的二分法,您不能使用通用列表List<Long>.toArray(Long[])来构建基本数组作为结果。可以使用原始集合,但无论使用哪种方式 - 使用列表或处理组 - 都将数据从临时存储复制到基本数组。

所以你建议的方式就是彼此一样好。如果它对性能敏感,请对两者进行分析并选择最适合您的正则表达式。

答案 2 :(得分:3)

public long[] parseString(String input) {

        final String[] parsed = input.split(",\\s?");
        final long[] values = new long[parsed.length];

        for (int i = 0; i < parsed.length; i++) {
            values[i] = Long.parseLong(parsed[i]);
        }

        return values;
}

答案 3 :(得分:2)

@Test
public void testParsing() throws Exception {
    String input = "1,3,5,6,33";
    long[] parsed = parseString(input);
    assertEquals(5, parsed.length);
    assertEquals(1, parsed[0]);
    assertEquals(3, parsed[1]);
    assertEquals(5, parsed[2]);
    assertEquals(6, parsed[3]);
    assertEquals(33, parsed[4]);
}
public long[] parseString(String input) {
    String[] split = input.split(Pattern.quote(","));
    long[] arr = new long[split.length];
    for (int i = 0; i < arr.length; i++) {
        arr[i] = Long.parseLong(split[i]);
    }
    return arr;
}

答案 4 :(得分:1)

在这种情况下你不能使用toArray。 ArrayLists仅存储对象,而不存储基元。因此,您不能存储int,long等。您必须将所有对象存储为Long对象或自己创建long的静态数组。

答案 5 :(得分:0)

List<Long> lErrors = new ArrayList<Long>();
lErrors.add(10L);
Long[] arr = null;
arr = new Long[lErrors.size()];
lErrors.toArray(arr);

答案 6 :(得分:-1)

我认为你也可以这样做。

public long[] parseString(String input)
{
            //1. Split with comma separated
            int nLength = input.Split(new char[] { ',' }).Length;
            long[] arList = new long[nLength];

            for (int i = 0; i < nLength; i++)
            {
                arList[i] = long.Parse(input.Split(new char[] { ',' })[i].ToString());
            }

            return arList;
}

用法:

long[] l = parseString("10, 30, 40, 50");