我正在编写一个方法来检查两个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中的对象,链表不是整数。有人可以解释一下是什么问题吗?
答案 0 :(得分:4)
您的代码存在以下问题:
result
变量始终为false,这似乎不对。所以再次仔细检查你的逻辑。那就是说,让我们使用泛型来解决原始类型问题如下:
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));