2

私はこの入力を持っています:

5
it
your
reality
real
our

最初の行は、後に続く文字列の数です。そして、私はそれをこのように保存する必要があります(疑似コード):

associative_array = [ 2 => ['it'], 3 => ['our'], 4 => ['real', 'your'], 7 => ['reality']]

ご覧のとおり、連想配列のキーは、内部配列に格納されている文字列の長さです。では、Javaでこれを行うにはどうすればよいですか? 私はPHPの世界から来たので、PHPと比較すると非常にうまくいきます。

4

5 に答える 5

3
MultiMap<Integer, String> m = new MultiHashMap<Integer, String>();

for(String item : originalCollection) {
    m.put(item.length(), item);
}
于 2013-01-04T18:30:15.313 に答える
1

Java には連想配列がありません。しかし、ほとんど同じ目標を達成するハッシュマップがあります。あなたの場合、任意のキーに対して複数の値を持つことができます。したがって、ハッシュマップの各エントリを配列または何らかのコレクションにすることができます。ArrayList が選択される可能性があります。あれは:

Hashmap<Integer,ArrayList<String>> words=new HashMap<Integer,ArrayList<String>>();

ファイルなどからリストを読み取るためのコードを調べるつもりはありません。それは別の質問です。しかし、構造がどのように機能するかを理解するために、リストをハードコーディングできるとします。次のようにできます。

ArrayList<String> set=new ArrayList<String)();
set.add("it");
words.put(Integer.valueOf(2), set);
set.clear();
set.add("your");
set.add("real");
words.put(Integer.valueOf(4), set);

等。

In practice, you probably would regularly be adding words to an existing set. I often do that like this:

void addWord(String word)
{
  Integer key=Integer.valueOf(word.length());
  ArrayList<String> set=words.get(key);
  if (set==null)
  {
    set=new ArrayList<String>();
    words.put(key,set);
  }
  // either way we now have a set
  set.add(word);
}

補足: プログラマーがこのように「set」を Hashmap に戻す、つまり「words.put(key,set)」でブロックを終了するのをよく見かけます。これは不要です。既に存在します。ハッシュマップから「セット」を取得すると、コピーではなく参照が取得されるため、行った更新は「そこ」にあるだけであり、元に戻す必要はありません。

免責事項: このコードは頭の中で思い浮かびません。明示または黙示の保証はありません。しばらく Java を書いていないので、構文エラーや関数名の誤りがあるかもしれません。:-)

于 2013-01-04T18:42:53.747 に答える
1

djechlin は既により良いバージョンを投稿していますが、JDK クラスのみを使用した完全なスタンドアロンの例を次に示します。

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;    
   public class Main {
        public static void main(String[] args) throws Exception{
            BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
            String firstLine = reader.readLine();
            int numOfRowsToFollow = Integer.parseInt(firstLine);
            Map<Integer,Set<String>> stringsByLength = new HashMap<>(numOfRowsToFollow); //worst-case size
            for (int i=0; i<numOfRowsToFollow; i++) {
                String line = reader.readLine();
                int length = line.length();
                Set<String> alreadyUnderThatLength = stringsByLength.get(length); //int boxed to Integer
                if (alreadyUnderThatLength==null) {
                    alreadyUnderThatLength = new HashSet<>();
                    stringsByLength.put(length, alreadyUnderThatLength);
                }
                alreadyUnderThatLength.add(line);
            }
            System.out.println("results: "+stringsByLength);
        }
    }

その出力は次のようになります。

3
bob
bart
brett
results: {4=[bart], 5=[brett], 3=[bob]}
于 2013-01-04T18:37:15.290 に答える
0

キーは小さな整数のように見えるため、リストのリストを使用できます。この場合、最も簡単な解決策は、次のような MultiMap を使用することです

Map<Integer, Set<String>> stringByLength = new LinkedHashMap<>();

for(String s: strings) {
   Integer len = s.length();
   Set<String> set = stringByLength.get(s);
   if(set == null)
        stringsByLength.put(len, set = new LinkedHashSet<>());
   set.add(s);
}
于 2013-01-04T18:30:36.337 に答える
0
private HashMap<Integer, List<String>> map = new HashMap<Integer, List<String>>();

void addStringToMap(String s) {
    int length = s.length();
    if (map.get(length) == null) {
        map.put(length, new ArrayList<String>());
    }
    map.get(length).add(s);
}   
于 2013-01-04T18:35:29.917 に答える