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?

提前致谢! 汤米

在您的代码中,ctmp 是指向同一集合的链接,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;
}