Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.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_Arraylist_Hashmap - Fatal编程技术网

java中的字谜查找

java中的字谜查找,java,arraylist,hashmap,Java,Arraylist,Hashmap,我遇到了一个问题。我有一个字符串数组,它由String[]={“eat”、“tea”、“tan”、“ate”、“nat”、“bat”}现在,我应该将那些上面有相同字母的单词分离出来,并组成一个组吃,茶,吃他们每个单词都有相同的字母,所以这是一组。第2组应为tan、nat,第3组应为bat。所以我必须列出一个列表来存储这些组 我的方法: 为了解决这个问题,我首先找出每个字母的ascii值,然后为一个单词添加这些ascii值。如eat找出e,a,t的ascii值并添加它们。我采用这种方法是因为如果字

我遇到了一个问题。我有一个字符串数组,它由
String[]={“eat”、“tea”、“tan”、“ate”、“nat”、“bat”}
现在,我应该将那些上面有相同字母的单词分离出来,并组成一个组<编码>吃,茶,吃他们每个单词都有相同的字母,所以这是一组。第2组应为
tan、nat
,第3组应为
bat
。所以我必须列出一个列表来存储这些组

我的方法:

为了解决这个问题,我首先找出每个字母的ascii值,然后为一个单词添加这些ascii值。如
eat
找出
e,a,t
的ascii值并添加它们。我采用这种方法是因为如果字母在单词中重复,那么它们必须具有相同的ascii和。然后我把它们分成相同的Ascii和,找出哪些单词有这些和,然后它们属于同一组

我的进步 我找出ascii和并将它们放在哈希映射中。但是我不能将相同的值分组。由于我未能将ascii值分组,我无法找到单词。我不知道如何继续

我也关注这些帖子

但有一种方法和我的方法不一样。而且问题和我的不同。我在这里讨论的是一种不同的方法,它依赖于ASCII值

我的代码:

public List<List<String>> groupAnagrams(String[] strs) {
    ArrayList<Character>indivistr=new ArrayList<>();
    ArrayList<Integer>dup=new ArrayList<>();
    HashMap<Integer,Integer>mappingvalues=new HashMap<>();
    for(int i=0;i<strs.length;i++){
        int len=strs[i].length();
        int sum=0;
        for(int j=0;j<len;j++){
            indivistr.add(strs[i].charAt(j));
            int ascii=(int)strs[i].charAt(j);
            sum=sum+ascii;

        }
        mappingvalues.put(i,sum);

    }
public List groupAnagrams(String[]strs){
ArrayListindivistr=新的ArrayList();
ArrayListdup=新的ArrayList();
HashMappingValues=新的HashMap();

对于(inti=0;i,基于asci方法,我已经编写了一个工作代码

public static void main(String[] args) {
        String[] values ={"eat", "tea", "tan", "ate", "nat", "bat"};
        Map<Integer, List<String>> resultMap = new HashMap<Integer, List<String>>();
        for (String value : values) {
            char[] caharacters = value.toLowerCase().toCharArray();
            int asciSum = 0;
            for (char character : caharacters) {
                asciSum = asciSum + (int)character;
            }
            System.out.println(asciSum);
            if(resultMap.containsKey(asciSum)) {
                resultMap.get(asciSum).add(value);
            }else {
                List<String> list = new ArrayList<String>();
                list.add(value);
                resultMap.put(asciSum, list);
            }
        }
        System.out.println(resultMap);
    }
但是如果我们遇到具有相同asci值和的diff字符,比如10+11=20+1 下面的代码将根据排序后的字符串生成结果映射

public static void main(String[] args) {
        String[] values ={"eat", "tea", "tan", "ate", "nat", "bat"};
        Map<String, List<String>> resultMap = new HashMap<String, List<String>>();
        for (String value : values) {
            char[] caharacters = value.toLowerCase().toCharArray();
            Arrays.sort(caharacters);
            String sortedValue = new String(caharacters);
            System.out.println(sortedValue);
            if(resultMap.containsKey(sortedValue)) {
                resultMap.get(sortedValue).add(value);
            }else {
                List<String> list = new ArrayList<String>();
                list.add(value);
                resultMap.put(sortedValue, list);
            }
        }
        System.out.println(resultMap);
    }

我已经修复了提供的评论和编辑。

这应该可以让您开始了

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

public class Main {

    public static void main(String args[]) throws Exception {

        String[] words ={"eat", "tea", "tan", "ate", "nat", "bat"};

        for(List<String> list : groupAnagrams(words))
            System.out.println(list);

    }

    public static List<ArrayList<String>> groupAnagrams(String[] words) {

        List<ArrayList<String>> wordGroups = new ArrayList<ArrayList<String>>();
        HashMap<Integer, ArrayList<String>> map = new HashMap<Integer, ArrayList<String>>();

        for(String word : words) {

            int sum = 0;
            for(char c : word.toCharArray())
                sum += c;
            if(map.containsKey(sum))
                map.get(sum).add(word);
            else {
                ArrayList<String> list = new ArrayList<String>();
                list.add(word);
                map.put(sum, list);
            }

        }

        for(ArrayList<String> list : map.values())
            wordGroups.add(list);

        return wordGroups;
    }
}
import java.util.ArrayList;
导入java.util.HashMap;
导入java.util.List;
公共班机{
公共静态void main(字符串args[])引发异常{
字符串[]单词={“吃”、“茶”、“晒”、“吃”、“纳特”、“蝙蝠”};
for(列表:组字谜(单词))
系统输出打印项次(列表);
}
公共静态列表groupAnagrams(字符串[]字){
List wordGroups=new ArrayList();
HashMap=newHashMap();
for(字符串字:字){
整数和=0;
for(char c:word.toCharArray())
总和+=c;
if(总图)
map.get(sum).add(word);
否则{
ArrayList=新建ArrayList();
列表。添加(word);
地图。放置(总和,列表);
}
}
for(ArrayList:map.values())
添加(列表);
返回词组;
}
}
这个程序将适用于这样的小规模的事情,但是考虑下面的输入数据:

{“a”,“@!”}

这些字符串的总和都是97


由于使用ASCII值查找字谜,您可能会遇到这样的情况。在您开始处理小写字母和大写字母之前,这并不是一件特别紧迫的事情。简单的解决方法是使用
字符串。ToUpperCase()
并将符号映射为巨大的数字,您就可以开始了。

我的想法是,首先创建一个类来存储原始字符串及其排序版本:

class Anagram {
   String s;
   String sorted;
}
然后我将输入映射到我的
字谜列表中

List<Anagram> collect = Arrays.stream(strs)
            .map(a -> new Anagram(a, Arrays.stream(a.split(""))
                    .sorted()
                    .reduce(String::concat).get()))
            .collect(Collectors.toList());
List collect=Arrays.stream(strs)
.map(a->new Anagram(a,Arrays.stream)(a.split(“”))
.已排序()
.reduce(字符串::concat.get())
.collect(Collectors.toList());
然后,我只需按排序字符串对获得的列表进行分组:

 Map<String, List<Anagram>> groupBy = collect
             .stream()
             .collect(Collectors.groupingBy(Anagram::getSorted));
Map groupBy=collect
.stream()
.collect(Collectors.groupingBy(Anagram::getSorted));
现在您已经有了带有分组字谜的列表,只需从中提取原始字符串:

List<List<String>> result = new ArrayList<>();

for(List<Anagram> list : collect1.values()) {
     List<String> myList = list.stream().map(Anagram::getS).collect(Collectors.toList());
     result.add(myList);
}
List result=new ArrayList();
对于(列表:collect1.values()){
List myList=List.stream().map(Anagram::get.collect(Collectors.toList());
结果.添加(myList);
}

“欢迎进行健康的讨论。”您是否尝试使用其他变量。因此,您将初始单词添加到该变量中。现在,对所有单词进行迭代。对于每个单词,对于每个字母,您将检查它是否在保存的单词中-如果未命中,请继续。(如果一个单词中的字母可能出现多次,你可能需要一些与每封信相关的计数器)(老实说,我很想把它看作是一种欺骗:)@JoeC有时我观察到,当有人在这里提问时,他或她得到的答案是,我们不解决家庭作业。因此,我认为,写下一整段代码可能不符合规则。因此我鼓励进行讨论。对一些问题的讨论是错误的,你不会从一些输入中得到正确的结果。如果你得到的总数是200,你现在如何让我加上100+100,或者加上90+110?所有的字都是小写的。@绝对加密。我为要存储的组创建了一个ArrayList的ArrayList。然后我创建了一个HashMap,它采用整数(字符串的总和)作为键和作为组的字符串的ArrayList。然后,我循环遍历字符串数组中的所有单词,并将每个字符添加到一个sum变量中。然后,我检查HashMap是否已包含sum。如果已将其添加到指定的组中。如果未包含,则使用键sum创建一个新组。然后,我将所有HashMap值添加到arrayList是可选的。如果我需要详细说明某个特定区域,请告诉我。
List<Anagram> collect = Arrays.stream(strs)
            .map(a -> new Anagram(a, Arrays.stream(a.split(""))
                    .sorted()
                    .reduce(String::concat).get()))
            .collect(Collectors.toList());
 Map<String, List<Anagram>> groupBy = collect
             .stream()
             .collect(Collectors.groupingBy(Anagram::getSorted));
List<List<String>> result = new ArrayList<>();

for(List<Anagram> list : collect1.values()) {
     List<String> myList = list.stream().map(Anagram::getS).collect(Collectors.toList());
     result.add(myList);
}