Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 存储长度为键的字符串的关联数组_Java_String_Collections_Associative Array - Fatal编程技术网

Java 存储长度为键的字符串的关联数组

Java 存储长度为键的字符串的关联数组,java,string,collections,associative-array,Java,String,Collections,Associative Array,我有以下意见: 5 it your reality real our 第一行是之后提交的字符串数。我应该这样存储它(伪代码): 如您所见,关联数组的键是存储在内部数组中的字符串的长度。 那么我如何在java中做到这一点呢?我来自php世界,所以如果您将它与php进行比较,它将非常好。MultiMap m=new MultiHashMap(); MultiMap<Integer, String> m = new MultiHashMap<Integer, String>(

我有以下意见:

5
it
your
reality
real
our
第一行是之后提交的字符串数。我应该这样存储它(伪代码):

如您所见,关联数组的键是存储在内部数组中的字符串的长度。 那么我如何在java中做到这一点呢?我来自php世界,所以如果您将它与php进行比较,它将非常好。

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

for(String item : originalCollection) {
    m.put(item.length(), item);
}
用于(字符串项:原始集合){ m、 放置(item.length(),item); }
由于键似乎是小整数,因此可以使用列表列表。在这种情况下,最简单的解决方案是使用类似

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);
}
Map-stringByLength=new-LinkedHashMap();
用于(字符串s:字符串){
整数len=s.length();
Set Set=stringByLength.get;
if(set==null)
stringsByLength.put(len,set=newlinkedhashset());
设置。添加(s);
}
私有HashMap map=newhashmap();
void addStringToMap(字符串s){
int length=s.length();
if(map.get(length)==null){
put(长度,newarraylist());
}
map.get(长度).add(s);
}   

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);
        }
    }

Java没有关联数组。但它确实有Hashmaps,这主要实现了相同的目标。在您的情况下,任何给定的键都可以有多个值。因此,您可以做的是使Hashmap中的每个条目都成为一个数组或某种集合。ArrayList是一个可能的选择。即:

Hashmap<Integer,ArrayList<String>> words=new HashMap<Integer,ArrayList<String>>();
Hashmap words=newhashmap();
我不打算通过代码从文件中读取列表,这是另一个问题。但是,为了让您了解该结构将如何工作,假设我们可以对列表进行硬编码。我们可以这样做:

3
bob
bart
brett
results: {4=[bart], 5=[brett], 3=[bob]}
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);

ArrayList set=new ArrayList同一个键有多个值。什么是原始集合?此代码使用apache commons collections库中的MultiMap类-@kirugan,这是您的原始集合。请举个例子,您知道php中的集合比java中的集合少,我是it新手,为什么要使用“new HashMap(numOfRowsToFollow)”?你认为它会节省内存吗?我认为这一个解决了所问的全部问题。我唯一的评论(尽管他没有明确地说这一点)他的示例按升序显示键。我认为,通过将HashMap更改为TreeMap,您可以免费获得这些键。@kirugan:习惯的力量。如果您不提供初始大小,则不会影响结果(因为java集合会自行增长/收缩)但有时,如果你事先知道一个集合将非常大/非常小,你可以通过让它一路增长/收缩来节省内存混乱itself@GSP当前位置它不会对任何内容进行排序,这正是我碰巧在技术上键入内容的方式,如果您要为Hashmap指定大小,您应该将其设置为大于实际条目数。默认情况下,Hashmap会调整大小,不是当你点击给定条目数时,而是当你点击其中的某个百分比时,我认为默认值是75%。此外,请记住,Hashmap中的值是散列的。如果你是Hashmap,则大小为5,这并不意味着5个条目数可以整齐地匹配。你几乎可以肯定如果散列冲突破坏了处理过程,最好留出一些空闲空间来最小化冲突。
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);
}