在字符串列表中查找字谜

时间:2013-10-23 13:33:54

标签: java

我开发了以下程序,在java中使用Hashmap打印anagrams.But无法弄清楚要放在行map.put();中的内容,以便将条目插入到hashmap中。

import java.util.*;

class anagram
{
    public static void main(String args[])
    {
        String temp;
        int i,n;
        Scanner s1=new Scanner(System.in);
        List<Integer> temp2;
        ArrayList<String> list=new ArrayList<String>();
        HashMap<String,ArrayList<Integer>> map=new HashMap<String,ArrayList<Integer>>();    
        System.out.println("Enter the number of strings");
        n=s1.nextInt();
        //Input the strings and store them in Hashmap after sorting each
        //string on character basis
        //e.g hello , olleh are both stored as "ehllo" --> 0,1
        //"ehllo" is sorted string and 0,1 are its keys
        //In this way, at the end each bucket in hashmap will have anagrams
        //which can be displayed on the basis of keys stored 
        for(i=0;i<n;i++)
        {
            temp=s1.next();
            list.add(temp);
            //what should I add here to input new string index into proper place
            map.put();
        }

        //Iterating the hashmap to print values of each bucket
        Iterator iterate=map.keySet().iterator();
        while(iterate.hasNext())
        {
            Map.Entry entry=(Map.Entry)iterate.next();
            temp2 =entry.getValue();
            for(i=0;i<temp2.size;i++)
                System.out.print(list.get(temp2.get(i))+" ");
        }   
        list.clear();
    }
    //method to sort the string
    private static String sort(String s)
    {
        char arr[]=s.toCharArray();
        Arrays.sort(arr);
        return String.valueOf(arr);
    }
}

2 个答案:

答案 0 :(得分:3)

将索引存储为值似乎是开销。

您可以存储输入值。 地图将是:

Map<String, Collection<String>> anagramsBySortedLettersInThem = ...

然后你可以使用'经典'模式:

String key = sort(inputString);

if (!anagramsBySortedLettersInThem.containsKey(key)) {
  anagramsBySortedLetterInThem.put(key, new HashSet<String>);
} 

anagramsBySortedLettersInThem.get(key).add(inputString);

我在这里使用Set,以避免重复。如果您需要重复 - 请使用例如ArrayList

答案 1 :(得分:0)

在我看来,你有一个非常好的计划。首先,您需要运行自定义排序函数以获取in order字符串。然后你需要在哈希映射上进行操作,看看你是否已经拥有该anagram集的实例。如果get返回一些东西,只需将索引添加到关联列表。如果没有创建新的数组列表,请添加新索引并使用排序键将其放入。