isPalindrome - 集合和列表反转
isPalindrome - Collection and List Reversal
这是学校的家庭作业实验室。我正在尝试反转 LinkedList,并检查它是否是回文(向后和向前相同)。我在网上看到了类似的问题,但没有多少人能帮助我解决这个问题。我以前制作过检查回文的程序,但是 none 检查数组或列表。所以,首先,这是我的 isPalindrome 方法:
public static <E> boolean isPalindrome(Collection<E> c) {
Collection<E> tmp = c;
System.out.println(tmp);
Collections.reverse((List<E>) c);
System.out.println(c);
if(tmp == c) { return true; } else { return false; }
}
我的教授希望我们将方法设置为接受所有集合,这就是我使用 Collection 并将其转换为反向方法列表的原因,但我不确定这样做是否正确。我知道它确实颠倒了列表。这是我的主要方法:
public static void main(String...strings) {
Integer[] arr2 = {1,3,1,1,2};
LinkedList<Integer> ll2 = new LinkedList<Integer>(Arrays.asList(arr2));
if(isPalindrome(ll2)) { System.out.println("Successful!"); }
}
问题是,我正在用一个不是回文的数组对此进行测试,这意味着它向后和向前不一样。我已经使用数组 {1,3,1} 对其进行了测试,它工作正常,因为这是一个回文。对于回文,使用 {1,3,1,1,2} 仍然 returns 正确,尽管显然不是。这是我使用 {1,3,1,1,2} 数组的输出:
[1, 3, 1, 1, 2]
[2, 1, 1, 3, 1]
Successful!
所以,它似乎正确地反转了列表,但是当它比较它们时,它假设它们是相等的?我认为 tmp == c 以及它如何检查它们是否相等存在问题。我假设它只是检查它是否包含相同的元素,但我不确定。我也尝试了 tmp.equals(c),但它返回了相同的结果。我只是好奇是否还有另一种方法可以使用,或者我是否必须编写一种方法来比较 tmp 和 c?
提前致谢!
汤米
在您的代码中,c 和 tmp 是指向同一集合的链接,tmp == c
将始终为真。您必须将您的集合克隆到新实例,例如:List<E> tmp = new ArrayList(c);
.
很多小点
public static <E> boolean isPalindrome(Collection<E> c) {
List<E> list = new ArrayList<>(c);
System.out.println(list);
Collections.reverse(list);
System.out.println(list);
return list.equals(new ArrayList<E>(c));
}
反向仅适用于有序列表。
一个人制作了该集合的副本。
一个使用 equals
来比较集合。
public static void main(String...strings) {
int[] arr2 = {1, 3, 1, 1, 2};
//List<Integer> ll2 = new LinkedList<>(Arrays.asList(arr2));
List<Integer> ll2 = Arrays.asList(arr2);
if (isPalindrome(ll2)) { System.out.println("Successful!"); }
}
您需要将 Collection
复制到 List
/ 数组。必须这样做,因为为 Collection
定义的唯一顺序是迭代器之一。
Object[] asArray = c.toArray();
您可以应用您选择的算法来检查此数组是否为回文,如果 Collection
是回文。
或者使用 LinkedList
检查列表是否是回文而不创建新的 List
来反转会更有效:
public static <E> boolean isPalindrome(Collection<E> c) {
List<E> list = new LinkedList<>(c);
Iterator<E> startIterator = list.iterator();
ListIterator<E> endIterator = list.listIterator(list.size());
for (int i = list.size() / 2; i > 0; i--) {
if (!Objects.equals(startIterator.next(), endIterator.previous())) {
return false;
}
}
return true;
}
这是学校的家庭作业实验室。我正在尝试反转 LinkedList,并检查它是否是回文(向后和向前相同)。我在网上看到了类似的问题,但没有多少人能帮助我解决这个问题。我以前制作过检查回文的程序,但是 none 检查数组或列表。所以,首先,这是我的 isPalindrome 方法:
public static <E> boolean isPalindrome(Collection<E> c) {
Collection<E> tmp = c;
System.out.println(tmp);
Collections.reverse((List<E>) c);
System.out.println(c);
if(tmp == c) { return true; } else { return false; }
}
我的教授希望我们将方法设置为接受所有集合,这就是我使用 Collection 并将其转换为反向方法列表的原因,但我不确定这样做是否正确。我知道它确实颠倒了列表。这是我的主要方法:
public static void main(String...strings) {
Integer[] arr2 = {1,3,1,1,2};
LinkedList<Integer> ll2 = new LinkedList<Integer>(Arrays.asList(arr2));
if(isPalindrome(ll2)) { System.out.println("Successful!"); }
}
问题是,我正在用一个不是回文的数组对此进行测试,这意味着它向后和向前不一样。我已经使用数组 {1,3,1} 对其进行了测试,它工作正常,因为这是一个回文。对于回文,使用 {1,3,1,1,2} 仍然 returns 正确,尽管显然不是。这是我使用 {1,3,1,1,2} 数组的输出:
[1, 3, 1, 1, 2]
[2, 1, 1, 3, 1]
Successful!
所以,它似乎正确地反转了列表,但是当它比较它们时,它假设它们是相等的?我认为 tmp == c 以及它如何检查它们是否相等存在问题。我假设它只是检查它是否包含相同的元素,但我不确定。我也尝试了 tmp.equals(c),但它返回了相同的结果。我只是好奇是否还有另一种方法可以使用,或者我是否必须编写一种方法来比较 tmp 和 c?
提前致谢! 汤米
在您的代码中,c 和 tmp 是指向同一集合的链接,tmp == c
将始终为真。您必须将您的集合克隆到新实例,例如:List<E> tmp = new ArrayList(c);
.
很多小点
public static <E> boolean isPalindrome(Collection<E> c) {
List<E> list = new ArrayList<>(c);
System.out.println(list);
Collections.reverse(list);
System.out.println(list);
return list.equals(new ArrayList<E>(c));
}
反向仅适用于有序列表。
一个人制作了该集合的副本。
一个使用 equals
来比较集合。
public static void main(String...strings) {
int[] arr2 = {1, 3, 1, 1, 2};
//List<Integer> ll2 = new LinkedList<>(Arrays.asList(arr2));
List<Integer> ll2 = Arrays.asList(arr2);
if (isPalindrome(ll2)) { System.out.println("Successful!"); }
}
您需要将 Collection
复制到 List
/ 数组。必须这样做,因为为 Collection
定义的唯一顺序是迭代器之一。
Object[] asArray = c.toArray();
您可以应用您选择的算法来检查此数组是否为回文,如果 Collection
是回文。
或者使用 LinkedList
检查列表是否是回文而不创建新的 List
来反转会更有效:
public static <E> boolean isPalindrome(Collection<E> c) {
List<E> list = new LinkedList<>(c);
Iterator<E> startIterator = list.iterator();
ListIterator<E> endIterator = list.listIterator(list.size());
for (int i = list.size() / 2; i > 0; i--) {
if (!Objects.equals(startIterator.next(), endIterator.previous())) {
return false;
}
}
return true;
}