4

key/value人とカウントのようなフォームペアの文字列を持つファイルがあります。例は次のようになります。

"Reggy, 15"
"Jenny, 20"
"Reggy, 4"
"Jenny, 5"

出力では、キーに基づいてすべてのカウント値を合計する必要があるため、この例の出力は次のようになります。

「レギー、19」「ジェニー、25」

これが私のアプローチです:

  1. 各行を読み取り、各行について、スキャナーを使用し,て区切り文字としてキーとカウントを取得します
  2. ここで、キーがすでに存在するかどうかを確認します。存在しない場合は、currentValuesをpreviousValuesに追加し、存在しない場合は、currentValueをHashMapの値として取得します。

実装例:

public static void main(final String[] argv) {
    final File file = new File("C:\\Users\\rachel\\Desktop\\keyCount.txt");

    try {
        final Scanner scanner = new Scanner(file);

        while (scanner.hasNextLine()) {
            if (scanner.hasNext(".*,")) {
                String key;
                final String value;

                key = scanner.next(".*,").trim();

                if (!(scanner.hasNext())) {
                    // pick a better exception to throw
                    throw new Error("Missing value for key: " + key);
                }

                key = key.substring(0, key.length() - 1);
                value = scanner.next();

                System.out.println("key = " + key + " value = " + value);
            }
        }
    } catch (final FileNotFoundException ex) {
        ex.printStackTrace();
    }
}

よくわからないのは、キーと値のペアを読み込んで、それに基づいてHashMapを作成する方法です。

また、アプローチは最適なものであるか、パフォーマンスをさらに向上させる方法があります。

4

6 に答える 6

8

これはほぼ間違いなく学習課題であるため、コードを書くことは避け、皆さんが楽しんでいただけるようにします。

を作成しますHashMap<String,Integer>。キーと値のペアが表示されるたびに、ハッシュ マップにキーの値があるかどうかを確認します (「containsKey(key)」を使用します)。存在する場合は、 を使用してその古い値を取得しget(key)、新しい値を追加して、 を使用して結果を保存しput(key, newValue)ます。キーがまだそこにない場合は、新しいキーを追加します。もう一度、put. intif the String value(use Integer.valueOf(value)for that)を作ることを忘れないでください。

最適化に関する限り、この時点での最適化は時期尚早です。うまくいきません! ただし、単一のループよりもはるかに高速になることは難しく、これもかなり単純です。

于 2013-02-08T22:17:21.433 に答える
2

これを試して:

Map<String, Long> map = new HashMap<String, Long>();

while (scanner.hasNextLine()) {
        if (scanner.hasNext(".*,")) {
            ....
            if(map.containsKey(key))
                map.put(key, map.get(key) + Long.valueOf(value));
            else
                map.put(key, Long.valueOf(value));
        }
    }
于 2013-02-08T22:19:19.447 に答える
2

個人的には、次を使用します。

Scanner.nextLine()String.split(",")、およびInteger.valueOf(value)

于 2013-02-08T22:18:02.253 に答える
2

値の分割について考えることができる最も簡単な方法:

    BufferedReader reader =  new BufferedReader(new FileReader(file));
    Map<String, Integer> mapping = new HashMap<String,Integer>();

    String currentLine;
    while ((currentLine = reader.readLine()) != null) {

        String[] pair  = currentLine.split(",");

         if(pair.length != 2){ //could be less strict
            throw new DataFormatException();
         }

         key = pair[0];
         value = Integer.parseInt(pair[1]);
         if(map.contains(key)){
             value +=  map.get(key);
         }
         map.put(key,value);
    }

パフォーマンスの点で最も効率的な方法ではない可能性が高いですが、非常に簡単です。Scanner通常は解析に使用されますが、ここでの解析は複雑に見えず、文字列の分割にすぎません。

于 2013-02-08T22:43:06.733 に答える
0

O(n) の時間の複雑さを持つ一種の遅いがクリーンなソリューション。このソリューションは、ある種の配列をバイパスします

 public class Solution {

    public static void main(String[] args) {
    // Anagram
            String str1 = "School master";
            String str2 = "The classroom";


            char strChar1[] = str1.replaceAll("[\\s]", "").toLowerCase().toCharArray();
            char strChar2[] = str2.replaceAll("[\\s]", "").toLowerCase().toCharArray();

            HashMap<Character, Integer> map = new HashMap<Character, Integer>();

            for (char c : strChar1) {
                if(map.containsKey(c)){
                    int value=map.get(c)+1;
                    map.put(c, value);
                 }else{
                     map.put(c, 1);
                 }

            }

            for (char c : strChar2) {
                if(map.containsKey(c)){
                    int value=map.get(c)-1;
                    map.put(c, value);
                 }else{
                     map.put(c, 1); 
                 }
            }

            for (char c : map.keySet()) {
                if (map.get(c) != 0) {
                    System.out.println("Not anagram");
                }
            }
                    System.out.println("Is anagram");
        }
    }
于 2015-10-20T22:00:12.617 に答える