2016-08-23 4 views
1
public String count(String input, String... words) { 
    List<String> wordList = Arrays.asList(words); 
    Map<String, Long> maps = Arrays.asList(input.split(SPACE)).stream() 
      .collect(groupingBy(Function.identity(), counting())); 
    long number = 0; 
    StringJoiner stringJoiner = new StringJoiner(System.lineSeparator()); 
    String s = maps.entrySet().stream() 
      .map(entry -> wordList.contains(entry.getKey()) ? entry.getKey() + ":" + entry.getValue() : ""+number + entry.getValue()).collect(Collectors.joining(System.lineSeparator())); 
    stringJoiner.add(s); 
    stringJoiner.add(NUMBER + number); 
    return stringJoiner.toString(); 
} 

上記のコードからわかるように、このような文字列入力があります。「1 2 hello luck 5 hello 7 luck hello 10 11 luck」と単語配列にはhello、luckがあります。複数のリストを含むJava 8ストリームとフィルタリング

私はこの数字などの文字列を検索したい:6、こんにちは:3、運:3

私は上記のコードを使用して、これをしようとしていますが、それは何らかの理由でそれをしない、誰かが助けることができますしてください?

答えて

1

groupingBy()とcounting()関数を含めるのを忘れてしまった。またSPACEとNUMBERが欠けているので、私はそれらが ""と ""を表すと仮定しました。

私は、文字列の値とその発生数を「マップ」で収集し、数字の数を追加しました(手動で「数字」キーを「マップ」に追加しました) )。この機能は、必要に応じて機能します。

public String count(String input, String... words) 
{ 
    List<String> wordList = Arrays.asList(words); 
    Map<String, Long> maps = new HashMap<>(); 
    // count the number of occurences of each word and all the numbers in the "Input" argument, and save word as 
    // key, number as value 
    Arrays.asList(input.split(" ")).stream() 
      .forEach(str -> { 
       if (maps.containsKey(str)) 
       { 
        // it's a string already contained in map 
        Long l = maps.get(str); 
        maps.put(str, ++l); 
       } 
       else 
       { 
        try 
        { 
         Long parse = Long.parseLong(str); 
         // it's a number 
         if (maps.containsKey("numbers")) 
         { 
          Long l = maps.get("numbers"); 
          maps.put("numbers", ++l); 
         } 
         else 
         { 
          // first number added 
          maps.put("numbers", (long) 1); 
         } 
        } 
        catch (NumberFormatException e) 
        { 
         // it's a string, not yet added to map 
         maps.put(str, (long) 1); 
        } 
       } 
      }); 
    StringJoiner stringJoiner = new StringJoiner(System.lineSeparator()); 
    String s = maps.entrySet().stream() 
      // first we filter out words 
      .filter(entry -> wordList.contains(entry.getKey())) 
      // then we convert filtered words and value to string 
      .map(entry -> entry.getKey() + ":" + entry.getValue()) 
      // collect 
      .collect(Collectors.joining(System.lineSeparator())); 
    stringJoiner.add(s); 
    // add numbers at the end 
    stringJoiner.add("numbers:" + maps.get("numbers")); 
    return stringJoiner.toString(); 
} 

EDIT:欠落しているメソッドは、Collectorsクラス(Collectors.groupingByとCollectors.counting)に由来することに気付きました。私は新しい情報であなたのコードを修復しようとしましたが、私が上で書いた関数以外の素晴らしい解決策は見当たりません。

問題は、指定された入力の数字の数を数えることにあります。ストリームの.mapまたは.filter関数の中で変数 "long number"をインクリメントすることはできません。さらに、どんな方法でも、try catchブロックを実行する必要があります。したがって、私は、出現回数とともにすべてをマップに分類し、検索した単語(「単語」パラメータ)をこのマップでフィルタリングし、最後に手動で「数値」オカレンスを追加することで解決すると良い解決策です。

関連する問題