我正在做一个需要返回long []的方法。它看起来像这样:
public long[] parseString(String input)
输入是如下字符串:
在parseString中我使用正则表达式获取所有数字并将它们添加到ArrayList中,因为我不知道它会找到多少次发生。
最后,我创建一个long [],其大小与arrayList相同,并为每个执行一次,将其添加到long [] var。
另一种方式是: 首先使用
计算每次出现的次数while ( matcher.find() ) size++;
然后使用size创建一个大小的long []并执行: matcher.reset()现在将long值保存在long []变量中。
您认为哪种方式最好?
有更好的方法吗?
请记住,我无法更改方法签名:(
答案 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");