2014-01-10 34 views
0

我創建了一個程序,從文件中讀取String,並檢查它是否是迴文。現在我需要改變它來檢查載體是否是迴文。我必須創建幾個載體並檢查它們是否是迴文。說我有以下載體檢查多個向量是否是palindromatic?

(1,2,3), (1,1,1), (2,2,2), (2,2,2), (1,1,1), (1,2,3) 

該計劃將使用兩個迭代器,並檢查首先是等於最後,如果第二等於倒數第二個,依此類推。這是我的String輸入程序:

import java.io.BufferedReader; 
import java.io.FileReader; 
import java.io.IOException; 
import java.util.ArrayList; 
import java.util.LinkedList; 
import java.util.Queue; 
import java.util.Stack; 
import java.util.Vector; 

public class Project4 
{ 
    public static void main(String[] args) throws IOException 
    { 
     Vector v1 = new Vector(3); 
     Vector v2 = new Vector(3); 
     Vector v3 = new Vector(3); 
     Vector v4 = new Vector(3); 
     ArrayList vectors = new ArrayList(); 
     v1.add(1); 
     v1.add(2); 
     v1.add(3); 
     v2.add(1); 
     v2.add(1); 
     v2.add(1); 
     v3.add(1); 
     v3.add(1); 
     v3.add(1); 
     v4.add(1); 
     v4.add(2); 
     v4.add(3); 
     vectors.add(v1); 
     vectors.add(v2); 
     vectors.add(v3); 
     vectors.add(v4); 
     if (isPalindrome(vectors))// If true, it's a palindrome 
      System.out.println("That is a palindrome."); 
     else // otherwise, it's not 
      System.out.println("That is not a palindrome."); 

    } 
    public static boolean isPalindrome(ArrayList vectors) 
    { 
     // Make a new queue, stack, and character object 
     Queue<Vector> q = new LinkedList<>(); 
     Stack<Vector> s = new Stack<>(); 
     for(int i = 0; i < vectors.size(); i++){ 
      q.add((Vector) vectors.get(i)); 
      s.add((Vector) vectors.get(i)); 
     } 
     Vector temp = new Vector(); 
     int mismatches = 0; 
     for (int i = 0; i < vectors.size(); i++) 
     { 
      temp = (Vector) vectors.get(i); 
      if (vectors.get(i).equals(vectors.get(i))) 
      { 
       q.add(temp); 
       s.push(temp); 
      } 
     } 

     while (!q.isEmpty()) 
     { 
      if (q.remove() != s.pop()) 
       mismatches++; // Increment "mismatches" if q != s 
     } 

     return (mismatches == 0); // will return true if the method did not change the variable "mismatches" 
    } 
} 

回答

1

請嘗試以下操作(非常簡單)。閱讀代碼中的評論,看看它是如何工作的。

代碼:

public static void main(String[] args) 
{ 
    int[] a = { 1, 2, 3 }; 
    int[] b = { 1, 2, 1 }; 
    int[] c = { 1, 2, 2, 1 }; 
    int[] d = { 1, 2, 3, 1 }; 
    int[] e = { 1 }; 
    System.out.println(is_palindrome(a)); 
    System.out.println(is_palindrome(b)); 
    System.out.println(is_palindrome(c)); 
    System.out.println(is_palindrome(d)); 
    System.out.println(is_palindrome(e)); 

} 

public static boolean is_palindrome(int[] arr) 
{ 
    for (int i = 0; i < arr.length/2; i++) { // Check just half times the size of 'arr' 
     // System.out.println(arr[i] + " - " + arr[arr.length - i - 1]); // Debug 
     if (arr[i] != arr[arr.length - i - 1]) // Check 'first' with 'last', 'second' with 'last - 1' ... 
      return false; 
    } 
    return true; 
} 

輸出:

false 
true 
true 
false 
true 
+0

Upvoted。這是測試是否迴文的「標準」方法。清晰,評論良好。 – Keeler

+0

這適用於您製作的數組內部的數字,但我必須檢查一組向量是否是palindromatic。所以,一個數組需要被向量填充,每個向量可能包含3個獨立的數字,然後它必須檢查第一個和最後一個向量是否相同,第二個和第二個向量等。所以(1,2, 3)和(1,2,3)是相等的,如果我們在陣列中只有那兩個我需要檢查迴文,那麼它將是palindromatic。最重要的是,我必須在is_palindrome方法中使用隊列和堆棧。 –

+1

可能包含3個,或者肯定包含3個?有所作爲。此外,這聽起來像作業或如果你有**使用堆棧和隊列的東西。 – Keeler

0

我認爲你正在試圖確定什麼是整數的扁平名單是否是一個迴文。通過拼合,我的意思是,如果你扁平[(3, 2, 1), (1, 2, 1), (1, 2, 3)],它會變成[3, 2, 1, 1, 2, 1, 1, 2, 3](你可以看到它是一個迴文)。

您的代碼存在一些問題。舉一個例子,爲什麼要檢查vectors.get(i).equals(vectors.get(i))?這將永遠評估爲真。

這個問題有作業的味道,所以我不會給你一個實現,但我會概述一個。

isPalindrome(ArrayList vectors)

  1. 按下前半部的vectors壓入堆棧。
  2. 隊列中vectors的後半部排隊,反向排列
  3. 比較x = q.remove()y = s.pop(),直到你沒有更多的元素。如果你仔細想一想,扁平化列表可以作爲迴文的唯一方法是如果xy(它們只是整數列表)是彼此相反的。

你可以從那裏拿它。有幾種方法可以實現,特別是第3步。