Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在搜索字谜时,有没有办法保持单词的大小写?_Java_Anagram - Fatal编程技术网

Java 在搜索字谜时,有没有办法保持单词的大小写?

Java 在搜索字谜时,有没有办法保持单词的大小写?,java,anagram,Java,Anagram,我需要编写一个程序,将整个文本文件读入字符串,并在其中搜索字谜。输出必须是同一类型的所有字谜,在单独的一行中使用它们原来的大写和小写字母书写 我尝试了以下方法,但没有得到我想要的结果(显然都是小写): String input=inputStringBuilder.toString(); input=input.replaceAll(“[^äÄöÖÖÖa-zA-Z],”).toLowerCase(); 字符串[]语句=输入。拆分(“”); Map anagrams=newhashmap(); f

我需要编写一个程序,将整个文本文件读入字符串,并在其中搜索字谜。输出必须是同一类型的所有字谜,在单独的一行中使用它们原来的大写和小写字母书写

我尝试了以下方法,但没有得到我想要的结果(显然都是小写):

String input=inputStringBuilder.toString();
input=input.replaceAll(“[^äÄöÖÖÖa-zA-Z],”).toLowerCase();
字符串[]语句=输入。拆分(“”);
Map anagrams=newhashmap();
for(int i=0;i<句子长度;i++){
char[]charwords=句子[i].toCharArray();
Arrays.sort(charwords);
字符串键=新字符串(字符);
设置anagramSet=anagrams.get(key);
如果(anagramSet==null){
anagramSet=newhashset();
字谜.put(key,anagramSet);
}
添加(第[i]句);
}

首先需要将
移动到lowercase()
调用

input = input.replaceAll("[^äÄöÖüÜßa-zA-Z ]", ""); // <== Removed from here
String[] sentence = input.split(" ");

Map<String, Set<String>> anagrams = new HashMap<>();

for(int i = 0; i < sentence.length; i++){

        char[] charwords = sentence[i].toLowerCase().toCharArray(); // <== Added here

        Arrays.sort(charwords);

        String key = new String(charwords);

        Set<String> anagramSet = anagrams.get(key);
        if (anagramSet == null) {
          anagramSet = new HashSet<>();
          anagrams.put(key, anagramSet);
        }

   anagramSet.add(sentence[i]);

}
试验

Input:这是对“the”和“the”的测试
结果:{}
输入:这是对“the”、“the”和“eth”的测试
结果:{eht=[the,the,eth]}

如果不想保留同一单词的所有大小写变体,只需使用
新树集(String.case\u insensitive\u ORDER)
使该集不区分大小写即可

(代码压缩,其中一些使用Java8特性)


你明白什么是字谜吗?我看不到代码中有任何地方你甚至试图检查字谜。@MushifAliNawaz是的,我知道它是做什么的。这就是我的问题。如果我删除它(因为大写和小写字符不一样),将
.toLowerCase()
input
语句移动到
charwords
语句:
char[]charwords=句子[I]。toLowerCase().tocharray()
---您希望少键入大小写(在
排序()之前)
,但
句子中的单词要有原始大小写。@Andreas这样做有效,但它保留了重复项(当然不是字谜)什么重复项?存储在
地图
集合
中,两者都不允许重复。
input = input.replaceAll("[^äÄöÖüÜßa-zA-Z ]", ""); // <== Removed from here
String[] sentence = input.split(" ");

Map<String, Set<String>> anagrams = new HashMap<>();

for(int i = 0; i < sentence.length; i++){

        char[] charwords = sentence[i].toLowerCase().toCharArray(); // <== Added here

        Arrays.sort(charwords);

        String key = new String(charwords);

        Set<String> anagramSet = anagrams.get(key);
        if (anagramSet == null) {
          anagramSet = new HashSet<>();
          anagrams.put(key, anagramSet);
        }

   anagramSet.add(sentence[i]);

}
// code from above here
for (Iterator<Set<String>> iter = anagrams.values().iterator(); iter.hasNext(); ) {
    Set<String> words = iter.next();
    if (words.size() == 1) {
        iter.remove(); // Not anagram: Single spelling only
    } else {
        Set<String> lower = new HashSet<>();
        for (String word : words)
            lower.add(word.toLowerCase());
        if (lower.size() == 1) {
            iter.remove(); // Not anagram: Multiple case variants, but all same spelling
        }
    }
}
Map<String, Set<String>> anagrams = new HashMap<>();
for (String word : input.replaceAll("[^äÄöÖüÜßa-zA-Z ]", "").split(" ")) {
    char[] letters = word.toLowerCase().toCharArray();
    Arrays.sort(letters);
    String key = new String(letters);
    anagrams.computeIfAbsent(key, k -> new TreeSet<>(String.CASE_INSENSITIVE_ORDER))
            .add(word);
}
anagrams.values().removeIf(words -> words.size() == 1);