在单词列表中查找Palindromes

时间:2013-04-14 22:51:10

标签: java

我正在开发一个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 个答案:

答案 0 :(得分:0)

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

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

“我想让计算机做什么我会自己做什么?”

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

等。

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

奇数/偶数将用于计算要读入的字母数。

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

如果是偶数(长度/ 2)字符。

然后,将这些字符与最后一个字符进行比较。请注意,您需要跳过奇数加长字符串的中间字符。 而不是上面的内容,它检查第1和第2,然后是第2和第3,然后是第3和第4个字符,请检查正面和背面,如此。

        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);}
        }

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

让我们解决问题:最后,你要检查单词的反面是否等于单词。我将假设您将所有单词存储在名为wordArray[]的数组中。

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

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
  }
}

答案 3 :(得分: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;
    }
}