0

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

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

我写的代码:

任何其他以不同方式执行此操作的建议也将受到欢迎提前谢谢你..

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

4 回答 4

3

你有很多问题正在发生..

首先,您缺少 main 方法中的左括号。

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

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()'ss 缺少要打印的变量,但现在这并不是非常重要。

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

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

应该

Object x=kannadahash.get(w);

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

于 2012-06-11T09:38:23.540 回答
1

我认为应该是

Object x = kannadahash.get(w);

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

V

于 2012-06-11T09:09:18.343 回答
0

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

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

此外,正如其他回答者指出的那样,您正在执行 get("w"),但是我怀疑您的意思是 Object x=kannadahash.get(w);

于 2012-06-11T09:18:01.597 回答
0

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

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

因此,地图将仅存储 Unicode,其中 key 为Hindi(Devanagari) 且 value 为 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)); 

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

你的主要问题在这里:

Object v = hindihash.get(st); 

stst = 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. 对于前两个符号,我们看到一些相关性,它们在 895 中的 ASCII 表位置不同,您应该检查此规则是否适用于其他字符。然后不需要地图,只需要验证 sing 是印地语(简单 if ),如果为真,则只需向其添加 985。

UTF-8 表

于 2012-06-11T11:21:49.870 回答