对象无法转换为整数错误

时间:2018-06-10 09:58:18

标签: java list object

我正在编写一个方法来检查两个int数组是否是彼此的旋转。例如,[4,5,6,7,1,2]是[1,2,4,5,6,7]

的旋转
public static Boolean isRotation(int[] array1, int[] array2) {
        boolean result = false;
        if(array1.length != array2.length){
            result = false;
        }
        ArrayList<Integer> alist = new ArrayList<Integer>();
        LinkedList arr2 = new LinkedList(Arrays.asList(array2));

        if(arr2.contains(array1[0])){
            Iterator x = arr2.listIterator(arr2.indexOf(array1[0]));
            while(x.hasNext()){
             alist.add(x.next());
            }
            if(!(arr2.peek().equals(array1[0]))){
                alist.add(arr2.peek());
                arr2.pollFirst();
            }
        }//end of outer if loop. 
    //Compare the arraylist to array1;
        for(int i = 0; i<array1.length; i++){
            if(array1[i] != arr2.get(i)){
                result = false;
            }
        }//end of for loop checking
        return result; 
    }//end of method;

}//end of class;

但是,我不断收到有关对象和整数的错误。 在行alist.add(x.next());和alist.add(arr2.peek());我不能使用add方法,因为我得到(参数不匹配; Object无法转换为Integer)错误; 在这一行if(array1[i] != arr2.get(i)){我得到了无与伦比的类型:int和Object错误。

我不明白为什么arr2中的对象,链表不是整数。有人可以解释一下是什么问题吗?

3 个答案:

答案 0 :(得分:4)

您的代码存在以下问题:

  1. 使用原始类型会产生上述错误。
  2. result变量始终为false,这似乎不对。所以再次仔细检查你的逻辑。
  3. 那就是说,让我们使用泛型来解决原始类型问题如下:

    ArrayList<Integer> alist = new ArrayList<>();
    LinkedList<Integer> arr2 = new LinkedList<>(Arrays.asList(array2));
    
    if(arr2.contains(array1[0])){
       Iterator<Integer> x = arr2.listIterator(arr2.indexOf(array1[0]));
       ...
       ...
    

    此时还有另一个问题,

    语句LinkedList<Integer> arr2 = new LinkedList<>(Arrays.asList(array2));将无法编译为array2类型为int[],因此接收方类型应为LinkedList<int[]>以使其编译但显然不是你追求的是什么。

    要解决此问题,您需要转换int[]。你可以这样做:

    LinkedList<Integer> arr2 = Arrays.stream(array2)
                                     .boxed() 
                                   .collect(Collectors.toCollection(LinkedList::new));
    

答案 1 :(得分:2)

您在ArrayList中使用泛型:

ArrayList<Integer> alist = new ArrayList<Integer>();

为什么不在以下地方使用它:

LinkedList<Integer> arr2 = new LinkedList(Arrays.asList(array2));

Iterator<Integer> x = arr2.listIterator(arr2.indexOf(array1[0]));

相反

LinkedList arr2 = new LinkedList(Arrays.asList(array2));

Iterator x = arr2.listIterator(arr2.indexOf(array1[0]));

另一个没有泛型的解决方案(在你的情况下没用),你必须强制转换每个对象:

alist.add((Integer) x.next());
          ^^^^^^^^^^^^^^^^^^

alist.add((Integer) arr2.peek());
          ^^^^^^^^^

if(array1[i] != (Integer) arr2.get(i)){
                ^^^^^^^^^

另一种解决方案

正如@Aominè和其他人提到你有几个问题你必须解决它们,我只想以另一种方式解决你的问题:

public static Boolean isRotation(int[] array1, int[] array2) {
    List<Integer> list1 = Arrays.stream(array1).boxed().collect(Collectors.toList());
    List<Integer> list2 = Arrays.stream(array2).boxed().collect(Collectors.toList());

    int size = list1.size();

    for (int i = 0; i < size; i++) {
        if (list1.equals(list2)) {
            return true;
        }
        Collections.rotate(list2, -1);
    }
    return false;
}

考虑你有这两个数组(我认为它们不是空的并且具有相同的长度)

array1 = {4, 5, 6, 7, 1, 2}
array2 = {1, 2, 4, 5, 6, 7}

对于array1中的每个元素,将它移动到最后并检查它是否与第二个数组不相等:

第一次迭代:

array1 = {4, 5, 6, 7, 1, 2}
array2 = {1, 2, 4, 5, 6, 7}

不等于

第二次迭代:

array1 = {4, 5, 6, 7, 1, 2}
array2 = {2, 4, 5, 6, 7, 1}//move 1 to the end

不等于

第二次迭代:

array1 = {4, 5, 6, 7, 1, 2}
array2 = {4, 5, 6, 7, 1, 2}//move 2 to the end

平等(和休息)

如果没有匹配且迭代结束,则返回false表示不等于

答案 2 :(得分:0)

因为您没有指定Integer类型参数:

LinkedList<Integer> arr2 = new LinkedList<>(Arrays.asList(array2));