Объект не может быть преобразован в целочисленную ошибку - PullRequest
0 голосов
/ 10 июня 2018

Я пишу метод, чтобы проверить, являются ли два целых массива вращением друг друга.Например, [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, потому что получаю ошибку (несоответствие аргумента; Объект не может быть преобразован в целое число);и в этой строке if(array1[i] != arr2.get(i)){ я получаю несопоставимые типы: int и Object error.

Я не понимаю, почему объект в arr2, связанный список не является целым числом.Может кто-нибудь объяснить, пожалуйста, что не так?

Ответы [ 3 ]

0 голосов
/ 10 июня 2018

Вы используете дженерики в 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}

для каждого элемента в массиве1 переместите его в конец и проверьте, равен ли он второму массиву не:

Первая итерация:

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 meanне равно

0 голосов
/ 10 июня 2018

Есть несколько проблем с вашим кодом:

  1. Использование необработанных типов приводит к вышеупомянутой ошибке.
  2. переменная result всегда ложна, что не кажется правильным.так что дважды проверьте свою логику еще раз.

Тем не менее, давайте решим проблему с необработанным типом следующим образом с использованием обобщений:

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));
0 голосов
/ 10 июня 2018

Поскольку вы не указали параметр Integer type:

LinkedList<Integer> arr2 = new LinkedList<>(Arrays.asList(array2));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...