独特的单词缩写替代解决方案?

时间:2016-05-14 04:34:10

标签: java arraylist hashmap

帮助!许多解决方案在HashMap中解决了它,它比ArrayList更有效,但是为了简化代码和作为初学者编码器:

  1. 我想知道它是否可以在ArrayList中解决:首先缩写所有元素和给定的单词,然后比较缩写的给定单词是否与数组中的任何元素匹配。请检查以&#34开头的代码;为什么不..."功能" isUnique2"。它一直给出错误,有人请告诉我如何修复它。

  2. 我的第二个想法是:比较第一个&&最后一个元素&&长度。这不是更简单吗?如果没有,请告诉我为什么这是错误的。

    //<first letter><number><last letter> check if a word is unique
    //Given dictionary = [ "deer", "door", "cake", "card" ] ,isUnique("dear") -> false, isUnique("cart") -> true, isUnique("cane") -> false, isUnique("make") -> true
    
    public class UniqueWordAbbr {
    
    Map<String, String> map= new HashMap<String, String>();
    
    public static void main(String[] args){
        String[] dictionary  = { "deer", "door", "cake", "card" };
        UniqueWordAbbr uwa = new UniqueWordAbbr(dictionary);
        System.out.println(uwa.isUnique2 (dictionary,"cane"));
        System.out.println(uwa.isUnique("word"));
    }
    //why not create array to check if elements match???
    public boolean isUnique2(String[] dictionary, String word) {
        String abbr_w = abbreviate(word);
        List abbr_dictionary = new ArrayList(); 
    
        for(int i = 0; i<dictionary.length; i++){
            String n_w = abbreviate(dictionary[i]);
            abbr_dictionary.add(n_w);
        }
        for (Object copy : abbr_dictionary) {
            if (abbr_w.equals(copy))
                 return false;
             else return true;
        }
        return false;
    }
    //1. abbreviate 
    private String abbreviate(String str){
        return str.charAt(0)+ Integer.toString(str.length()-2) + str.charAt(str.length()-1);
    }   
    //2. establish the map, convert array into map
    public UniqueWordAbbr(String[] dictionary){
          for(int i = 0; i < dictionary.length; i++){
            String abbr = abbreviate(dictionary[i]);
            //always check if map does NOT contain first!
            if (!map.containsKey(abbr)){
                map.put(abbr, dictionary[i]);
            }else{
                map.put(abbr, "");
            }   
        }
    }
    // check if word is unique
    public boolean isUnique(String word) {
        String abbr_w = abbreviate(word);
        //为啥不直接 查询 map.containsKey(abbr_w)?
            if (map.containsKey(abbr_w)) {
                //why also need to compare the value? 
                if (map.get(abbr_w).equals(word)){
                    return true;
                }else {
                    return false;
                }
            }
        return true;
    }
    

    }

1 个答案:

答案 0 :(得分:1)

关于你的第一个问题:这个想法可能会被认为是好的(但请参阅下面的我的表现评论),但是你似乎与你想要缩短词典项目的时间不一致:你试图做它在构造函数中,然后再次在isUnique2()中执行:String n_w = abbreviate(dictionary[i]);

关于你的第二个问题:我知道你已经知道了答案。 :-)
为什么我知道这个?在构造函数UniqueWordAbbr()中,您已经检查过您的缩略语的冲突:if (!map.containsKey(abbr))。所以你已经知道,碰撞发生了,必须加以考虑。防止碰撞的第一道防线是良好的散列(=一种很好的缩写方法) - 即一种使碰撞极不可能的方法。你在abbreviate()中表达的想法并不擅长产生独特的哈希值。因此,您的程序必须经常恢复到您必须编写代码的下一行防御(因此您的程序将减慢执行此附加代码的速度......)

从绩效角度来看我建议你考虑一下:
1.每次拨打isUnique2()时,一次又一次地缩短字典的重要部分是浪费时间。
缩短整个字典的次数更为合理,但在构造函数中这样做会禁用对现有字典的未来更新。在性能方面,通常最好在每次更新时缩写。
2.您还必须将未缩写和缩写的表单存储在一起,您现在只能在List abbr_dictionary中暂时存在于isUnique2()中。所以你快速松开它......
3.您正在使用线性搜索搜索词典。这是低效的,因为该搜索的复杂性是O(n)。但是使用例如二进制搜索需要在每次更新后保持字典哈希(您的“缩写”)的顺序。