1

我正在开发一个 Java 程序,用于查找嵌入在单词列表文件中的回文列表。我正在介绍 Java 类,因此将不胜感激任何形式的帮助或指导!

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

import java.util.Scanner;
import java.io.File;

class Palindromes {

    public static void main(String[] args) throws Exception {
        String pathname = "/users/abrick/resources/american-english-insane";
        File dictionary = new File(pathname);
        Scanner reader = new Scanner(dictionary);
        while (reader.hasNext()) {
            String word = reader.nextLine();
            for (int i = 0; i > word.length(); i++) {
                if (word.charAt(word.indexOf(i) == word.charAt(word.indexOf(i)) - 1) {
                    System.out.println(word);
                }
            }
        }
    }
}

我正在导入的列表中有 3 个单词是 7 个字母或更长。

4

4 回答 4

0

我假设您正在阅读字符串。用于string.toCharArray()将每个字符串转换为 char[]。使用 for 循环遍历字符数组,如下所示:在迭代 1 中,如果第一个字符等于最后一个字符,则继续下一次迭代,否则返回 false。在迭代 2 中,如果第二个字符等于倒数第二个字符,则继续下一次迭代,否则返回 false。以此类推,直到到达字符串的中间,此时返回 true。小心一个接一个的错误;有些字符串的长度是偶数,有些字符串的长度是奇数。

如果您的回文检查器不区分大小写,则用于string.toLowerCase().toCharArray()预处理字符数组。

您可以在 for 循环中使用string.charAt(i)而不是;string.toCharArray()在这种情况下,如果回文检查器不区分大小写,则使用string = string.toLowerCase()

于 2013-04-14T22:59:34.150 回答
0

让我们把问题分解一下:最后,您正在检查单词的反转是否等于单词。我将假设您将所有单词存储在一个名为wordArray[].

我有一些代码用于获取单词的反义词(从此处复制):

public String reverse(String str) {
  if ((null == str) || (str.length() <= 1)) {
    return str;
  }
  return new StringBuffer(str).reverse().toString();
}

所以,现在我们只需要在每个单词上都调用它。所以:

for(int count = 0; count<wordArray.length;count++) {
  String currentWord = wordArray[count];
  if(currentWord.equals(reverse(currentWord)) {
    //it's a palendrome, do something
  }
}
于 2013-04-14T23:02:35.027 回答
0

你有几种方法可以解决这个问题。

如果出现以下情况,则将单词视为回文:

  • 它可以向后和向前读取相同的方式。
  • 第一个元素与最后一个元素相同,直到我们到达中间。
  • 字的一半与另一半相同,颠倒过来。
  • 长度为 1 的单词通常是回文。

最终,您的方法并没有做太多。事实上,您根本没有进行任何验证 - 如果第一个和最后一个字符匹配,您只会打印单词。

这是一个建议:让我们阅读字符串的每一端,看看它是否是回文。我们必须考虑它可能为空或长度为 1 的情况。我们还希望消除字符串中的任何空白,因为这可能会导致验证错误 - 我们replaceAll("\\s", "")用来解决这个问题。

 public boolean isPalindrome(String theString) {
    if(theString.length() == 0) {
        throw new IllegalStateException("I wouldn't expect a word to be zero-length");
    }
    if(theString.length() == 1) {
        return true;
    } else {
        char[] wordArr = theString.replaceAll("\\s", "").toLowerCase().toCharArray();
        for(int i = 0, j = wordArr.length - 1; i < wordArr.length / 2; i++, j--) {
            if(wordArr[i] != wordArr[j]) {
                return false;
            }
        }
        return true;
    }
}
于 2013-04-14T23:03:10.247 回答
0

由于这是家庭作业,我不会为您提供代码。

当我编码时,我做的第一件事就是退后一步问自己,

“我想让电脑做什么,而我自己会做什么?”

好的,所以你有这个 huuuuge 字符串。可能是这样的:“lkasjdfkajsdf adda aksdjfkasdjf ghhg kajsdfkajsdf oopoo”

ETC..

字符串的长度要么是奇数,要么是偶数。所以,首先,检查一下。

奇数/偶数将用于计算要读入多少个字母。

如果单词是奇数,则读入 ((length-1)/2) 个字符。

如果偶数 (length/2) 个字符。

然后,将这些字符与最后一个字符进行比较。请注意,对于奇数长度的字符串,您需要跳过中间字符。而不是你上面的检查第一个和第二个,然后是第二个和第三个,然后是第三个和第四个字符,从前面和后面向内检查,就像这样。

        while (reader.hasNext()) {
        String word = reader.nextLine();
          boolean checker = true;

        for (int i = 0; i < word.length(); i++) {
              if(word.length()<2){return;}
            if (word.charAt(i) != word.charAt(word.length()-i)  {
               checker = false;
            }

        }
        if(checker == true)
          {System.out.println(word);}
        }
于 2013-04-14T22:58:48.817 回答