当前位置: 首页 > 知识库问答 >
问题:

Java Palindrome Program(我是否走上正轨)?

诸俊才
2023-03-14

我只有6个月的Java经验(我也是新来的),所以如果我的代码看起来不完全正确,请原谅我。请注意,它仍然是一项正在进行中的工作。我试着写一个程序,接受字符串,只打印那些回文。

我应该: - 创建一个名为isPalindrome的方法,它有一个String参数,并且 - 根据字符串是否是回文返回一个布尔值。然后 - 修改主要方法以使用isPalindrome仅打印回文。

例如,如果我输入:“madam James apple mom timer”,它应该打印“madam”和“mom”。

这基本上就是我正在尝试编写的程序:例如:让我们使用“女士”这个词。程序将检查第一个和最后一个字母是否匹配(“madam”)。如果这是真的,那么它将检查下一个字母,这次是“a”和“a”(“madam)。依此类推。

这是我到目前为止的Java代码:

public class Palindrome 
{
    private String theWord; //Error: The value of the field Palindrome.theWord is not used

    public boolean isPalindrome( String theWord ) {
        int firstPointer = 0;
        int secondPointer = theWord.length() - 1;

        for ( int i = 0; i < theWord.length( ); i++ ) {
            if ( theWord.charAt[0] == theWord.charAt (theWord.length() - 1) ) { //Error: charAt cannot be resolved or is not a field
                return true;
            }
            return false;
        }
    }


    public static void main( String[] theWord ) {
        Palindrome = new Palindrome( ); //Error: Palindrome cannot be resolved to a variable

        for ( int i = 0; i < theWord.length; i++ ) {
            while (firstPointer < secondPointer) { //Error: "firstPointer" cannot be resolved to a variable. "secondPointer" cannot be resolved to a variable
                if ( theWord.charAt[0] == theWord.charAt (theWord.length() - 1) ) {  //Error: charAt cannot be resolved to a variable or is not a field. Cannot invoke length() on the array type String[]
                    firstPointer++; //Error: "firstPointer" cannot be resolved to a variable
                    secondPointer++; //Error: "secondPointer" cannot be resolved to a variable
                }
                System.out.println(theWord);
            }
        }
    }
}

如果您能帮我知道我哪里出了问题,我将不胜感激。请不要只是给我正确的代码。我想弄清楚这一点。非常感谢你。

**编辑:我现在已经将错误作为注释包含在代码中。顺便说一句,我正在使用Eclipse。

--

if ( theWord.charAt(i) == theWord.charAt (theWord.length() - i - 1) ) {
                    leftPointer++;
                    rightPointer--;

我现在得到一个“不能在数组类型String[]上调用charAt(int)”“不能在数组类型String[]上调用tend()”。这是剩下的两个错误,然后我将测试代码。我一直在尝试解决这些问题一段时间,但我仍然不完全确定这些错误意味着什么。

Eclipse建议我更改<b>这个词。字符(i)到这个词。长度这不是我想要的。它还建议我从<I>长度</I>中删除“()”,但我认为这也不正确。

共有3个答案

荆炳
2023-03-14

最短的方法可能只是遵循定义:如果你反转字符串,它仍然相同,那么它就是一个回文:

public static boolean isPalindrome(String input)
{
    String reverse = new StringBuilder(input).reverse().toString();
    return input.equalsIgnoreCase(reverse);
}

但是如果有一个教育目标(?),并且出于某种原因应该使用迭代器,恕我直言,从字符串的外部向字符串的内部迭代更有意义。

public static boolean isPalindrome(String input)
{
  int length = input.length();
  for (int i = 0; i < length/2 ; i++)
  {
    if (input.charAt(i) != (input.charAt(length-1-i))) return false;
  }
  return true;
}

在您的示例中,您使用了主字符串[]参数的输入。这里只是一些信息,以防您想手动将其拆分为单词。

相当于你现在得到的:

String[] words = phrase.split("\\s+");
for (String word : words) 
{
  // do stuff
}

split方法使用分隔符将字符串拆分为串[]。分隔符\\s是一个正则表达式,表示所有类型的空白(不仅是空格,还有制表符、新行字符等)。

但是它并不完美(你的方式也不完美),短语中仍然可以有逗号、点和其他标记。您可以使用Character.isLetterOrDigit方法在迭代中过滤这些字符。或者,您可以执行替换(...)来删除逗号、点和其他标记。或者您也可以使用更复杂的正则表达式。

第一条错误消息:“未使用字段的值”。错误消息是由全局私有字段theWord引起的,因为它从未被使用过。它未被使用是因为您在方法isPalindrom(String theWord)中也有一个同名的参数。每当您在该方法中引用theWord时,它总是会在考虑全局变量之前为方法参数提供优势。

看起来你被困在这里有一个设计矛盾。回文类到底是什么?有2个选项:

  1. 它应该是一个像<code>Math<code>类那样的工具箱吗?像<code>布尔值=回文。isPalindrome(“女士”)
  2. 或者它应该是使用构造函数实例化的对象?像<code>布尔值=新回文(“madam”).isPalindrome()

选项 1:工具箱:

public class Palindrome 
{
  // removed the private field theWord

  // make this method static !!
  public static boolean isPalindrome( String theWord ) {
    ...
  }

  public static void main( String[] theWord ) {
    // remove the Palindrome object

    // inside the loop check use the static method 
    // which does not require an object.
    if ( Palindrome.isPalindrome(word))
    {
    }
  }
}

选项2:一个对象

public class Palindrome 
{
  // keep the private field theWord
  private String theWord;

  public Palindrome(String theWord)
  {
    // set the value of the argument to the private field
    this.theWord = theWord;
  }

  // don't make this method static 
  // also you don't need the parameter any more.
  // it will now use the global field theWord instead of a parameter.
  public boolean isPalindrome() {
    ...
  }

public static void main( String[] theWord ) {
    // inside the loop check use an object
    Palindrome palindrome = new Palindrome(word);
    if ( palindrome.isPalindrome())
    {
    }
}

至于关于第一个Pointer和第二个Pointer的错误。您需要定义并初始化这些变量。即 put int firstPointer = 0; 在循环之前。

贾飞鸿
2023-03-14

好吧,让我们把每件事都分解成相当大的小块。

>

  • 输入字符串
  • 解析字符串,检查它是否是回文
  • 打印出字符串中的回文单词。

    public class Main {
    
    public static void main(String[] args) {
    
        Scanner scan = new Scanner(System.in);
        System.out.println("Enter a sentence: ");
    
        String sentence = scan.nextLine(); // 1.
    
        String[] words = sentence.split(" ");
    
        for (String word : words) {  // 3.
            if (isPalindrome(word)) {
                System.out.println(word);
            }
        }
    }
    
    /**
     * Check if the string is a palindrome.
     * @param string
     * @return True if string is palindrome.
     */
    public static boolean isPalindrome(String string) { // 2.
    
        for (int i = 0; i < string.length() / 2; i++) {
            if (string.charAt(i) != string.charAt(string.length() - i - 1)) {
                return false;
            }
        }
    
        return true;
    }}
    

    方法/函数isPalinine是静态的,因为我们是从静态上下文中调用它,这是main函数。如果你想非静态地使用它,你可以把它放在一个类中并从该类创建一个对象。其余的应该是可以理解的。:-)

  • 靳金鹏
    2023-03-14

    看看你的是Palindrome方法

    if ( theWord.charAt(0) == theWord.charAt (theWord.length() - 1) 
    

    在这里,您总是将第一个字符与最后一个字符进行比较。在每次迭代中,您应该比较一对不同的字符,直到找到一对不匹配的字符,或者到达单词的中间。

    你应该使用循环的 i 变量:

    if ( theWord.charAt(i) == theWord.charAt (theWord.length() - i - 1) 
    

    返回值应该完全相反。如果发现一对不匹配的字符,则返回 false。仅当循环结束而不返回 false 时,才返回 true

     类似资料:
    • 问题内容: 我想在Java中使用池化连接(因为每个线程创建一个连接非常昂贵),所以我正在使用该对象。我正在跨线程保留我的数据源。因此,我在整个应用程序中仅使用一个数据源,如下所示: 现在,我已经创建了数据源,然后在每个单独的线程中执行以下操作: 我猜我很困惑, 这真的 是在 获取池连接吗? 这个线程安全吗?我注意到PooledConnection具有诸如notify()和wait()之类的方法…这

    • 使用Fork-Join框架的资源,创建一个同步多线程系统,从三个文本文件中形成一个最大长度的单词集合。不要使用中间集合来读取文本。在本例中,工作由存储在MaxLengthWord类的arr字段中的数组表示。createSubtasks()方法递归地将任务分成更小的工作部分,直到每个工作部分都小于阈值。

    • 什么是树上随机游走?我们可以假设给定一棵树,树的某个结点上有一个硬币,在某一时刻硬币会等概率地移动到邻接结点上,问硬币移动到邻接结点上的期望距离。 1. 树上随机游走用到的定义: ●  所讨论的树 ● 结点的度数 ● 结点与 v 结点之间的边的边权 ● 结点的父结点 ● 结点的子结点集合 ● 结点的兄弟结点集合 2. 向父结点走的期望距离 设代表 u 结点走到其父结点的期望距离,则有:     分

    • 😭😭😭 团子我的团子终于带我走了,发出来让大家沾沾喜气 ⏳ 再发一遍进度(速通😋) 4.25下午一面 4.25晚上二面 4.26上午oc 4.26下午offer 基础技术部-对象存储 go语言 看面经可以看我之前帖子哈 #晒一晒我的offer#

    • 为了澄清,在这种假设情况下,给的参数是由用户控制的,可以是任意的;我对它们没有确切的控制权(我不能禁止输入)。但是,我可以编辑。

    • 这里的图片显示了我当前的问题,我尽最大努力修改路径。JAVA\u HOME的路径是正确的,但我一直很困惑,因为它总是显示出来,即使我已经修改了它。如果我尝试放置SDK的目录路径,则会出现相同的错误。 图像链接:https://i.stack.imgur.com/LeipD.png