通过变量从哈希映射获取密钥

时间:2012-06-11 08:58:14

标签: java hashmap

您好我是java新手我希望我能找到问题的答案..我正在尝试使用hashmap编写一个程序,我从一个包含印地文字符(印度语)的文件中输入每个字符映射到第一个hashmap从中获取相应的值(每个字符的unicode值),然后将该值带到另一个hashmap,从中获取相应的值(不同语言中相同字符的unicode值),这应该被带到第三个哈希映射,检索相应的键(对应字符).. 前两个映射工作正常,但是当映射到第三个hashmap时,它返回null而不是kannada(印度语)中的字符键。这个程序是用一种语言将文件转换为另一种语言。

对象x = kannadahash.get(“w”);是我得到的部分而不是字符

我写的代码:

以不同的方式做任何其他建议也是受欢迎的 提前谢谢..

import java.util.*;
import java.util.Properties;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;
import java.util.Enumeration;
import java.util.Collections;

public class Hashmap1 {

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

                HashMap hindihash=new HashMap();
                hindihash.put("अ",905);
                hindihash.put("आ",906);
                HashMap kannadahash=new HashMap();
                kannadahash.put("ಅ","C85" );
                kannadahash.put("ಆ","C86");
                HashMap hkhash = new HashMap();
                hkhash.put(905,"C85" );
                hkhash.put(906,"C86");
                File f = new File("D:/Hello.txt");
                if (!f.exists() && f.length() < 0)
                 {
                        System.out.println("The specified file does not exist");
                 } 
                else 
                 {
                        FileReader fr = new FileReader(f);
                        BufferedReader reader = new BufferedReader(fr);
                        String st = " ";
                        while ((st = reader.readLine()) != null)
                        {
                            Object v = hindihash.get(st);  
                            Object w=hkhash.get(v);
                               if(w!=null)
                                 {
                                     System.out.println(" "+w.toString());
                                 }
                                else
                                {
                                   System.out.println("There is no key named  " +
                                    "in the HashMap.");
                                }

                             Object x=kannadahash.get("w");

                             if(x!=null)
                             {
                                 System.out.println(" "+x.toString());
                             }
                           else
                             {
                                   System.out.println("There is no key named  " +
                                   "in the HashMap.");
                             }
                        }

                     } 

                  }          

4 个答案:

答案 0 :(得分:3)

你有很多问题在继续......

首先,您在主方法中缺少左括号。

其次,您应该在HashMaps中使用泛型,如下所示:

HashMap<String, Integer> hindihash = new HashMap<String, Integer>();

这样你在使用.get()时就不必担心处理对象了。你知道HashMap会将String值映射到Integer值。类型安全很重要。

第三,这个if语句将无法正常工作:

if (!f.exists() && f.length() < 0)

虽然不需要检查length(),但我可以理解为什么你需要它。如果用户有一个名为“Hello.txt”的空文件,那么您可能希望将该文件视为不存在。没关系,但是当文件不存在时f.length()返回0,而不是-1。所以你的if语句没有正确启动。

第四,你的kannadahash HashMap似乎是倒退的。 अ= 905. hkhash.get(905)=“C85”。 kannadahash.get(“C85”)不存在。也许你的意思是:

kannadahash.put("C85", "ಅ" );

这样,hindihash.get(“अ”)= 905,hkhash.get(905)=“C85”,kannadahash.get(“C85”)返回ಅ。

第五,如果你的目标是“音译”整个文件,这将不起作用:

while ((st = reader.readLine()) != null)

正如您所知,这将立即读取文件的每一行。您希望使用BufferedReader的.read()方法单独读取文件的每个字符。或者,您可以使用for循环遍历使用.readLine()读入的整行,但在这种情况下,只使用.read()可能会更好。

第六,您的调试System.out.println()缺少要打印的变量,但现在这并不是非常重要。

最后,就像其他人提到的那样:

Object x=kannadahash.get("w");

应该是

Object x=kannadahash.get(w);

您还应该努力改进变量名称和间距。这非常重要。

答案 1 :(得分:1)

我认为应该是

Object x = kannadahash.get(w);

这是因为"w"指的是字符串而不是变量w

V

答案 2 :(得分:0)

kannadahash不应倒置吗?据我了解,你想查找一个hindihash来获取它的代码,然后使用hkhash将该代码转换为另一个代码,然后使用代码从kannadahash检索相应的字符,因此kannadahash的键应该是unicode值,而不是那些角色。例如:

HashMap kannadahash=new HashMap();
kannadahash.put("C85", "ಅ");
kannadahash.put("C86", "ಆ");

此外,正如另一位回答者所指出的,你正在做(“w”),但我怀疑你的意思 Object x=kannadahash.get(w);

答案 3 :(得分:0)

嗨,这个问题可能是您在解决方案中实现的复杂逻辑造成的。

单张地图就足够了,你可以在这里存储印地语和卡纳达语之间的关系。我不是那种语言的专家,也不知道彼此之间的任何关系。因此,我将重点关注涉及关联映射的解决方案,其中一个字符可以分配给另一个字符。但你可以调查语言属性以找到更好的关系,并且可能使用数组就足够了。

因此,地图将只存储密钥为Hindi(梵文)的Unicode,值为Kannada

Map<Intger,Integer> hindiToHannada = new HashMap<Intger,Integer>();

   hindiToHannada.put(0x905,0xC85); //0x stand for hex
   hindiToHannada.put(0x906,0xC86); //Observation 1

然后我们需要正确阅读文件。

BufferedReader in = new BufferedReader(new InputStreamReader(stream, encoding)); 

其中stream是文件,编码可以是“UTF-8”

你的主要问题在于:

Object v = hindihash.get(st); 

st自然是st = reader.readLine(),你不在地图中存储一行。

String line; 
StringBuilder newLine = new StringBuilder();

while ((line = reader.readLine()) != null) {
  newLine.delete(0,newLine.length());
  newLIne.ensureCapacity(line.length();


  for(int pos = 0; len = line.length(); pos < len; pos++) {

   char c = line.charAt(pos);

   if(isHindi(c)) {
       newLine.append(transforToHannada(c));
    } else {
       newLine.append(c);
    }
  }
}

观察1。 对于前两个符号,我们看到一些相关性,它们在ASCII表位置的895中都不同,您应该检查此规则是否适用于其他字符。那么就不需要地图了,但只有唱歌才能证明是印地语(简单如果),如果是真的那么只需加985即可。

UTF-8 table