我知道之前曾多次被问过,但我仍然无法理解我的错误。
这只是我正在编写的用于计算数组中重复次数的正常代码(:)这可能是一个非常长的方法,如果你能想到的话,请提出一个更小的方法)
public int find(int[] sequence)
{
Arrays.sort(sequence);
int temp=0,count=0,j=0;
HashMap<Integer,Integer> data = new HashMap<Integer,Integer>();
for(int i:sequence){
Integer c = new Integer(count);
Integer d = new Integer(j);
if(i!=temp) {
if(count!=0) data.put(c,d);
count++;
j=1;
temp=i;
}
else j++;
}
count++;//This one causes the error
//System.out.println(count);
Integer c = new Integer(count);
Integer d = new Integer(j);
data.put(c,d);
long ans = TheSwapsDivTwo.factorial(sequence.length);
for(int i=1;i<=data.size();i++){
ans /= TheSwapsDivTwo.factorial(data.get(i).intValue());
System.out.println(data.get(i));
}
return (int)ans;
}
public static long factorial(int n) {
long fact = 1; // this will be the result
for (long i = 1; i <= n; i++) {
fact *= i;
}
return fact;
}
put
方法在for
循环中不会产生任何错误,但它会在循环外实现。
错误是这样的:
java.lang.NullPointerException
at TheSwapsDivTwo.find(TheSwapsDivTwo.java:54)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at com.topcoder.services.tester.java.TestProcess$Runner.run(TestProcess.java:386)
P.S。 count ++导致错误...愚蠢真的..循环超出界限..
答案 0 :(得分:1)
这是应给予NPE的界限:
TheSwapsDivTwo.factorial(data.get(i).intValue());
即。 data.get(i)
不存在1<=i<=data
,要么对每个null
值进行get
检查,要么确保在您的逻辑中所有i
都出现在地图中你需要推荐。
放置null的测试:
Map<Integer, Integer> m = new HashMap<Integer, Integer>();
m.put(null, null);
System.out.println(m);
打印:
{null=null}
答案 1 :(得分:1)
如果使用地图,请尝试此
for (Item i : list)
{
Integer f = map.get(i);
if (f == null)
map.put(i, 1);
else
map.put(i, ++f);
}
然后遍历地图。或者您可以使用Guava
中的 MultiSetMultiset<Item> items = HashMultiset.create(sequence);
System.out.println(items.count(someItem));
for (Multiset.Entry<Item> entry : items.entrySet()) {
System.out.println(entry.getElement() + " - " + entry.getCount() + " times");
}
答案 2 :(得分:0)
看起来data.get(i)
返回null。之所以会发生这种情况,是因为您尝试获取非现有元素(当i = data.size()
)
使用:
for(int i=1;i<data.size();i++){
您放入data
的密钥从1开始到data.size()-1
顺便说一句,你应该修改缩进并在所有if和else语句之后添加{}。