您好我是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.");
}
}
}
}
答案 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即可。