0

我知道它以前被问过很多次,但我仍然无法理解我的错误..

这只是我正在编写的用于计算数组中重复次数的普通代码(:) 这可能是一个很长的方法,如果您能想到,请建议一种更小的方法)

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)

PS count++ 导致了错误......真的很愚蠢......循环超出了界限......

4

3 回答 3

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}
于 2013-05-21T11:32:00.943 回答
1

如果使用地图,试试这个

for (Item i : list)
   {
     Integer f = map.get(i);

     if (f == null)
         map.put(i, 1);
     else
         map.put(i, ++f);
   }

然后遍历 Map。或者你可以使用GuavaMultiSet

Multiset<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");
 }
于 2013-05-21T11:33:39.187 回答
0

看起来data.get(i)返回null。发生这种情况是因为您尝试获取不存在的元素(何时i = data.size()

利用:

for(int i=1;i<data.size();i++){

当您输入的键data从 1 开始到data.size()-1

顺便说一句,您应该在 if 和 else 语句之后修复缩进并添加 {}。

于 2013-05-21T11:33:04.707 回答