2016-09-27 55 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; 
}