isPalindrome - 收集和列表撤销

时间:2016-09-27 15:36:42

标签: java arrays collections linked-list palindrome

这是一所学校的家庭作业实验室。我试图反转LinkedList,并检查它是否是回文(相同的向后和向前)。我在网上看到了类似的问题,但没有多少能帮助我解决这个问题。我之前制作了检查回文的程序,但没有检查数组或列表的程序。所以,首先,这是我的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}对于回文仍然是正确的,尽管显然不是。这是我使用{1,3,1,1,2}数组的输出:

[1, 3, 1, 1, 2]
[2, 1, 1, 3, 1]
Successful!

所以,它似乎正在正确地反转List,但是当它比较它们时,它假设它们是相等的?我相信tmp == c存在问题以及它如何检查它们是否相等。我假设它只是检查它是否包含相同的元素,但我不确定。我也尝试了tmp.equals(c),但它返回了相同的结果。我只是好奇是否有另一种方法我可以使用或者我必须编写一种方法来比较tmp和c?

提前谢谢! 托米

3 个答案:

答案 0 :(得分:2)

在您的代码中 c tmp 是指向同一集合的链接,tmp == c将始终为true。您必须将集合克隆到新实例,例如:List<E> tmp = new ArrayList(c);

答案 1 :(得分:0)

许多小点

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!"); }
}

答案 2 :(得分:0)

您需要将Collection复制到List /数组。必须这样做,因为为Collection定义的唯一排序是迭代器之一。

Object[] asArray = c.toArray();

如果Collection是一个回文,你可以应用你选择的算法来检查这个数组是否是一个要检查的回文。

或者使用LinkedList,如果列表是palindrom而没有创建新的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;
}