0

こんにちは私はjavaに慣れていないので、問題の答えが見つかるといいのですが。対応する値(各文字のUnicode値)を取得し、その値を別のハッシュマップに取得し、そこから対応する値(異なる言語の同じ文字のUnicode値)を取得します。これを3番目のハッシュマップに取得し、対応するキーを取得する必要があります。 (対応する文字)。最初の2つのマッピングは正常に機能していますが、3番目のハッシュマップにマッピングすると、カンナダ(インド言語)の文字であるキーの代わりに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

かなりの数の問題が発生しています。

まず、メインメソッドに開き角かっこがありません。

次に、次のように、HashMapでジェネリックを実際に使用する必要があります。

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

そうすれば、.get()を使用するときにオブジェクトの処理について心配する必要はありません。HashMapが文字列値を整数値にマップすることを知っています。型安全性は重要です。

第三に、このifステートメントは正しく機能しません。

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

length()チェックは必要ありませんが、なぜそれが必要なのか理解できます。ユーザーが「Hello.txt」という名前の空のファイルを持っている場合は、そのファイルを存在しないと見なすことができます。それは問題ありませんが、ファイルが存在しない場合、f.length()は-1ではなく0を返します。したがって、ifステートメントは正しく起動しません。

第4に、kannadahashHashMapが逆方向に表示されます。अ=905。hkhash.get(905)="C85"。kannadahash.get( "C85")は存在しません。おそらくあなたはこれを意味しました:

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

このように、hindihash.get( "अ")= 905、hkhash.get(905)= "C85"、およびkannadahash.get( "C85")はಅを返します。

第5に、ファイル全体を「音訳」することが目標である場合、これは機能しません。

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

お分かりのように、ファイルの各行を一度に読み取ります。BufferedReaderの.read()メソッドを使用して、ファイルの各文字を個別に読み取る必要があります。または、forループを使用して、.readLine()で読み込んだ行全体を反復処理することもできますが、この場合は.read()を使用する方がよいでしょう。

第6に、デバッグSystem.out.println()には、出力する変数がありませんが、今のところそれほど重要ではありません。

そして最後に、他の人が述べたように:

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

カンナダハシュを逆にすべきではありませんか?私が理解しているように、hindihashを検索してそのコードを取得し、hkhashを使用してそのコードを別のコードに変換し、コードを使用してkannadahashから適切な文字を取得する必要があります。したがって、kannadahashのキーはユニコード値ではなくユニコード値である必要があります。キャラクター。例えば:

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

さらに、他の回答者が指摘したように、あなたはget( "w")を実行していますが、 Object x=kannadahash.get(w);

于 2012-06-11T09:18:01.597 に答える
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.最初の2つの符号については、いくつかの相関関係が見られます。これらは両方とも、ASCIIテーブルの位置が895で異なり、このルールが他の文字に適用されることを確認する必要があります。その場合、マップは必要ありませんが、歌うことがヒンディー語であることを確認するだけで(の場合は単純)、trueの場合は985を追加するだけです。

UTF-8テーブル

于 2012-06-11T11:21:49.870 に答える