代码之家  ›  专栏  ›  技术社区  ›  user3434094

带方法的Palindrome.java

  •  0
  • user3434094  · 技术社区  · 10 年前

    这个程序运行时不会抛出任何异常,但不管输入如何,结果总是一样的:“空白”是回文。每次输入是回文时,我都想知道是否有人对为什么会发生这种情况有任何建议?以下是程序代码:

    class Palindrome
    {
        public static void main(String args[])
        {
            int num = 0;
            int dig1 = 0;
            int dig2 = 0;
            int dig3 = 0;
            int dig4 = 0;
            int dig5 = 0;
            boolean digits = true;
    
            retrieveInput(num);
            check(num,dig1,dig2,dig3,dig4,dig5);
            display(digits,num);
        }
    
        public static int retrieveInput(int num)
        {
            String number;
            number = JOptionPane.showInputDialog("Enter A Five Digit Number.");
            num = Integer.parseInt(number);
    
            while(num < 9999 || num > 99999)
            {
                JOptionPane.showMessageDialog(null, num + " Is Not A Five Digit Number",
                    "ERROR", JOptionPane.ERROR_MESSAGE);        
                number = JOptionPane.showInputDialog("Enter A Five Digit Number.");
                num = Integer.parseInt(number);
    
            }
            return num;
        }
    
        public static boolean check(int num,int dig1,int dig2,int dig3,int dig4,int dig5)
        {
            boolean digits;
    
            dig1 = num / 10000;
            dig2 = num % 10000 / 1000;
            dig3 = num % 10000 % 1000 / 100;
            dig4 = num % 10000 % 1000 % 100 /10;
            dig5 = num % 10000 % 1000 % 100 % 10 / 1;
    
            if (dig1 == dig5 && dig2 == dig4)
                digits = true;
            else
                digits = false;
    
            return digits;
        }
    
        public static void display(boolean digits, int num)
        {
            num = retrieveInput(num);
            if (digits = false)
                JOptionPane.showMessageDialog(null, num + " is a palindrome");
            else
                JOptionPane.showMessageDialog(null, num + " is not a palindrome");
        }
    }
    
    2 回复  |  直到 10 年前
        1
  •  2
  •   Community CDub    7 年前

    第二行 display(boolean, int) ,您正在尝试将布尔值与 = 操作人员这 digits false 我想你是想说:

            if (digits == false)
    

    if语句需要输入布尔值,即。 if(bool) 。你不需要检查这是真是假 if(bool == true) 因为 bool == true 始终计算为相等 bool 布尔==真 是完全冗余的。然而,你 bool == false 始终计算结果与 布尔 这个 ! 运算符翻转以下布尔值,例如。 !true 计算结果为 假的 . !bool 因此始终求值为 布尔 ,与相同 布尔==假 .

    因此,您只需要:

            if (!digits)
    

    这样做也被认为是很好的做法。

    另一种使代码更短的方法是使用 三元运算符 。这不一定是最好的做法,但我个人喜欢这样做:

    代替

    if (digits = false)
        JOptionPane.showMessageDialog(null, num + " is a palindrome");
    else
        JOptionPane.showMessageDialog(null, num + " is not a palindrome");
    

    具有

    JOptionPane.showMessageDialog(null, num + " is " + (digits ? "not " : "") + "a palindrome");
    

    有关三元运算符的更多信息,请参阅以下页面:

    另一点需要注意的是,您不需要将输入处理为整数,因为您从不在算术语句中使用数字;你只比较数字的位数。在这段工作代码中,我将其作为字符串处理,因此它要短得多:

    import javax.swing.*;
    
    class Palindrome
    {
        public static void main(String args[])
        {
            display();
        }
    
        /**
         * Returns a five-digit string
         */
        public static String retrieveInput()
        {
            String number = JOptionPane.showInputDialog("Enter A Five Digit Number:"); //get input
            while(number.length() != 5) //continue to get input while it is not five digits
            {
                JOptionPane.showMessageDialog(null, number + " Is Not A Five Digit Number",
                    "ERROR", JOptionPane.ERROR_MESSAGE);        
                number = JOptionPane.showInputDialog("Enter A Five Digit Number:");
            }
            return number; //return the input
        }
    
        /**
         * Returns whether the given five digit string is a palindrome
         */
        public static boolean check(String number)
        {
            return (number.charAt(0) == number.charAt(4) && number.charAt(1) == number.charAt(3)); //checks to see if the first character equals the fifth character and the second character equals the fourth character
        }
    
        public static void display()
        {
            String number = retrieveInput(); //gets input
    
            if(check(number)) //if it is a palindrome
            {
                JOptionPane.showMessageDialog(null, number + " is a palindrome"); //say it is a palindrome
            }
            else
            {
                JOptionPane.showMessageDialog(null, number + " is not a palindrome"); //say it isn't a palindrome
            }
        }
    }
    
        2
  •  1
  •   Bengt    10 年前

    您的代码有几个缺陷:

    /* The goal of this method is to receive user input and return the
     * entered value. For this you don't need the num input parameter.
     */
    public static int retrieveInput(int num)
    {
        String number;
        number = JOptionPane.showInputDialog("Enter A Five Digit Number.");
        num = Integer.parseInt(number);
    
        while(num < 9999 || num > 99999)
        {
            JOptionPane.showMessageDialog(null, num + " Is Not A Five Digit Number",
                "ERROR", JOptionPane.ERROR_MESSAGE);        
            number = JOptionPane.showInputDialog("Enter A Five Digit Number.");
            num = Integer.parseInt(number);
    
        }
        return num;
    }
    
    /* Check takes a number and returns if the number is a palindrome or not.
     * The digits of the number are calculated within the method and thus 
     * shouldn't be parameters. (You didn't use these anyway)
     */
    public static boolean check(int num,int dig1,int dig2,int dig3,int dig4,int dig5)
    {
        boolean digits;
    
        /* If you removed the paremeters, you've to declare the variables here,
         * e.g. int dig1 = num / 10000
         */
        dig1 = num / 10000;
        dig2 = num % 10000 / 1000;
        dig3 = num % 10000 % 1000 / 100; // This is not needed, because it's not used anywhere
        dig4 = num % 10000 % 1000 % 100 /10;
        dig5 = num % 10000 % 1000 % 100 % 10 / 1;
    
        /* The pattern you used here is basically
         * if cond == true then return true else return false
         * You never have to use this pattern, since you can
         * directly return conditions
         */
        if (dig1 == dig5 && dig2 == dig4)
            digits = true;
        else
            digits = false;
    
        return digits;
    }
    
    /*
     * This method displays a popup to the user that states if a given number
     * is a palindrome or not. It expects the result and the number as paremeters.
     */
    public static void display(boolean digits, int num)
    {
        /* You are (again) retrieving the input here, although the input
         * is passed to this method.
         */
        num = retrieveInput(num);
    
        /* As The Guy with The Hat pointed out in his answer,
         * = is the assignment operator. For comparisons you have to use
         * == instead.
         */
        if (digits = false)
            JOptionPane.showMessageDialog(null, num + " is a palindrome");
        else
            JOptionPane.showMessageDialog(null, num + " is not a palindrome");
    }
    
    /*
     * Here is the general control flow of your program
     */
    public static void main(String args[])
    {
        // These variable declarations can be removed, since you aren't using,
        // nor need them.
        int num = 0;
        int dig1 = 0;
        int dig2 = 0;
        int dig3 = 0;
        int dig4 = 0;
        int dig5 = 0;
        boolean digits = true;
    
        retrieveInput(num); // you are retrieving the input, but not storing it
        check(num,dig1,dig2,dig3,dig4,dig5); // you are checking, but not storing the result
        display(digits,num);
    }
    

    修正版本:

    public static void main(String args[]) {
        int num = retrieveInput();
        boolean isPal = check(num);
        display(num, isPal);
    }
    
    public static int retrieveInput() {
        String number = JOptionPane
                .showInputDialog("Enter A Five Digit Number.");
        int num = Integer.parseInt(number);
    
        while (num < 9999 || num > 99999) {
            JOptionPane.showMessageDialog(null, num
                    + " Is Not A Five Digit Number", "ERROR",
                    JOptionPane.ERROR_MESSAGE);
            number = JOptionPane.showInputDialog("Enter A Five Digit Number.");
    
        }
        return num;
    }
    
    public static boolean check(int num) {
        int dig1 = num / 10000;
        int dig2 = num % 10000 / 1000;
        // int dig3 = num % 10000 % 1000 / 100;
        int dig4 = num % 10000 % 1000 % 100 / 10;
        int dig5 = num % 10000 % 1000 % 100 % 10 / 1;
    
        return dig1 == dig5 && dig2 == dig4
    }
    
    public static void display(int num, boolean isPal) {
        if (isPal)
            JOptionPane.showMessageDialog(null, num + " is a palindrome");
        else
            JOptionPane.showMessageDialog(null, num + " is not a palindrome");
    }
    

    请注意,我基本上没有改变您程序的核心。作为下一步,您可能需要检查用户是否输入了非数字字符或允许n长度的数字。