2016-09-27 50 views
0

这是一个学校的家庭作业实验室。我试图扭转一个LinkedList,并检查它是否是一个回文(相同的后退和前进)。我在网上看到了类似的问题,但没有多少帮助我解决这个问题。我制作了一些程序来检查回文,但没有检查数组或列表。因此,首先,这是我isPalindrome方法: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; } 
} 

我的教授要我们设置方法为接受所有集合这就是为什么我用收集并投它作为反向方法的名单,但我米不知道这是否正确完成。我知道它确实颠倒了名单。这是我的主要方法:

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}仍然会为回文返回true,但显然不是。下面是使用{1,3,1,1,2}阵列我的输出:

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

所以,这似乎是正确的扭转名单,但是当它们进行比较,它假定他们是平等的吗?我相信tmp == c有一个问题,它是如何检查它们是否相等。我认为它只是检查它是否包含相同的元素,但我不确定。我也试过tmp.equals(c),但它返回了相同的结果。我只是好奇,是否有另一种方法,我可以使用或者我必须编写一个方法来比较tmp和c?

预先感谢您! 汤米

+0

首先,如果'收藏C'不是'List',当您执行'(列表)c'时,您将遇到'ClassCastException'。 – cheb1k4

+0

@ cheb1k4有没有一种方法可以让Collections.reverse()接受一个Collection? –

+0

不,你不能,'Collections.reverse'只接受一个'List'。你必须找到另一种方式。也许你可以用https://docs.oracle.com/javase/7/docs/api/java/util/Collections.html#reverseOrder() – cheb1k4

回答

2

在你的代码ÇTMP都指向同一个收集和tmp == c会总是如此。您必须将您的收藏夹复制到新实例,例如:List<E> tmp = new ArrayList(c);

+0

做些什么谢谢!我使用LinkedList而不是ArrayList,但它的工作原理,谢谢。 –

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

您需要将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; 
}