Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/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 如何在迭代时添加到作为HashMap值的ArrayList?_Java_Performance_Data Structures_Hashmap_Big O - Fatal编程技术网

Java 如何在迭代时添加到作为HashMap值的ArrayList?

Java 如何在迭代时添加到作为HashMap值的ArrayList?,java,performance,data-structures,hashmap,big-o,Java,Performance,Data Structures,Hashmap,Big O,我有一个HashMap,键的值是ArrayList。当我逐行读取文件时,我需要添加到属于该特定键的ArrayList中。 文件可能有1行或100万行,键名将是行(字符串),它的值将表示文件中出现的行号 有人能帮我吗?此外,这种快速时间复杂性明智吗?如果不是,我如何优化它 示例test.txt: Hello <== Line 0 Jello <== Line 1 Mello <== Line 2 Hello <== L

我有一个HashMap,键的值是ArrayList。当我逐行读取文件时,我需要添加到属于该特定键的ArrayList中。 文件可能有1行或100万行,键名将是行(字符串),它的值将表示文件中出现的行号

有人能帮我吗?此外,这种快速时间复杂性明智吗?如果不是,我如何优化它

示例test.txt:

Hello        <== Line 0
Jello        <== Line 1
Mello        <== Line 2
Hello        <== Line 3
Tello        <== Line 4
Jello        <== Line 5
Tello        <== Line 6
Tello        <== Line 7
我的代码是:

ArrayList<Integer> al = new ArrayList<Integer>();
Map<String, ArrayList<Integer>> hm = new HashMap<String, ArrayList<Integer>>();

int num = 0;
for (String line = file.readLine(); line != null; line = file.readLine()) {
    map.put(line, al.add(num)); <== the issue is here, how to fix?
}
ArrayList al=new ArrayList();
Map hm=新的HashMap();
int num=0;
对于(字符串line=file.readLine();line!=null;line=file.readLine()){

map.put(line,al.add(num));您的问题是数组列表上的
add
方法返回布尔值

您正在尝试一个“concordance”应用程序,在Java中搜索解决方案非常简单


至于你的复杂性问题,使用一个哈希映射,其关键字是单词,其值是行号的数组列表,这是非常好的(并且应该具有接近最优的复杂性,因为每个行处理都需要摊销的常量时间)。但是,只要所有内容都在内存中,情况就是这样!如果你的单词文件达到了数百万个,你可以使用中间文件与一个好的map reduce框架进行协调。

你的问题是数组列表上的
add
方法返回一个布尔值

您正在尝试一个“concordance”应用程序,在Java中搜索解决方案非常简单

至于你的复杂性问题,使用一个哈希映射,其关键字是单词,其值是行号的数组列表,这是非常好的(并且应该具有接近最优的复杂性,因为每个行处理都需要摊销的常量时间)。但是,只要所有内容都在内存中,情况就是这样!如果您的单词文件达到数百万,您可以使用中间文件与良好的map reduce框架进行协调。

Java 8:

map.computeIfAbsent(line, k -> new ArrayList<>()).add(num);
map.computeIfAbsent(line,k->newArrayList()).add(num);
Java 7:

ArrayList<Integer> values = map.get(line);
if (values == null) {
    map.put(line, values = new ArrayList<>());
}
values.add(num);
arraylistvalues=map.get(行);
如果(值==null){
put(line,values=newarraylist());
}
添加(num);
Java 8:

map.computeIfAbsent(line, k -> new ArrayList<>()).add(num);
map.computeIfAbsent(line,k->newArrayList()).add(num);
Java 7:

ArrayList<Integer> values = map.get(line);
if (values == null) {
    map.put(line, values = new ArrayList<>());
}
values.add(num);
arraylistvalues=map.get(行);
如果(值==null){
put(line,values=newarraylist());
}
添加(num);

ArrayList的add函数返回一个表示成功或失败的布尔值。这就是为什么会出现错误。您必须首先将您的编号添加到列表中,然后将列表放入映射中。但代码中存在另一个问题。您将在所有键上反复添加相同的列表

请尝试以下代码:

Map<String, ArrayList<Integer>> hm = new HashMap<String, ArrayList<Integer>>();
int currentLineNumber = 0;
for (String line = file.readLine(); line != null; line = file.readLine()) {

    if(!hm.containsKey(line))
    {
        hm.put(line, new ArrayList<Integer>());
    }

    hm.get(line).add(currentLineNumber);

    currentLineNumber++;
}
Map hm=newhashmap();
int currentLineNumber=0;
对于(字符串line=file.readLine();line!=null;line=file.readLine()){
如果(!hm.containsKey(行))
{
hm.put(line,newarraylist());
}
hm.get(行).add(当前行号);
currentLineNumber++;
}

ArrayList的add函数返回一个表示成功或失败的布尔值。这就是为什么会出现错误。您必须首先将您的编号添加到列表中,然后将列表放入映射中。但代码中存在另一个问题。您将在所有键上反复添加相同的列表

请尝试以下代码:

Map<String, ArrayList<Integer>> hm = new HashMap<String, ArrayList<Integer>>();
int currentLineNumber = 0;
for (String line = file.readLine(); line != null; line = file.readLine()) {

    if(!hm.containsKey(line))
    {
        hm.put(line, new ArrayList<Integer>());
    }

    hm.get(line).add(currentLineNumber);

    currentLineNumber++;
}
Map hm=newhashmap();
int currentLineNumber=0;
对于(字符串line=file.readLine();line!=null;line=file.readLine()){
如果(!hm.containsKey(行))
{
hm.put(line,newarraylist());
}
hm.get(行).add(当前行号);
currentLineNumber++;
}

您要做的是将整数添加到HashMap键,而不是整个ArrayList

试着这样做:

            Map<String, ArrayList<Integer>> hm = new HashMap<String, ArrayList<Integer>>();

            String key="";
            while(file.readLine()!=null){
              key=file.readLine();  
      ArrayList<Integer> al = new ArrayList<Integer>();

          OUT: for (String line = file.readLine(); line != null; line = file.readLine()) { 
if(key.equals(line)){
              al.add(num);
  }
    else{
     break OUT;
}
}
             map.put(key, al);
        }
Map hm=newhashmap();
字符串键=”;
while(file.readLine()!=null){
key=file.readLine();
ArrayList al=新的ArrayList();
OUT:for(String line=file.readLine();line!=null;line=file.readLine()){
if(键等于(行)){
al.add(num);
}
否则{
爆发
}
}
地图放置(键,al);
}

此解决方案尚未经过测试,但我认为这会起作用。

您正在做的是将整数添加到HashMap键,而不是整个ArrayList

Integer num = 0;
for (String line = file.readLine(); line != null; line = file.readLine()) {

    if(!hm.containsKey(line))
    {
        hm.put(line, new ArrayList<Integer>());
    }

    hm.get(line).add(num);

    num++;
}
试着这样做:

            Map<String, ArrayList<Integer>> hm = new HashMap<String, ArrayList<Integer>>();

            String key="";
            while(file.readLine()!=null){
              key=file.readLine();  
      ArrayList<Integer> al = new ArrayList<Integer>();

          OUT: for (String line = file.readLine(); line != null; line = file.readLine()) { 
if(key.equals(line)){
              al.add(num);
  }
    else{
     break OUT;
}
}
             map.put(key, al);
        }
Map hm=newhashmap();
字符串键=”;
while(file.readLine()!=null){
key=file.readLine();
ArrayList al=新的ArrayList();
OUT:for(String line=file.readLine();line!=null;line=file.readLine()){
if(键等于(行)){
al.add(num);
}
否则{
爆发
}
}
地图放置(键,al);
}
此解决方案尚未经过测试,但我认为这将起作用。

Integer num=0;
Integer num = 0;
for (String line = file.readLine(); line != null; line = file.readLine()) {

    if(!hm.containsKey(line))
    {
        hm.put(line, new ArrayList<Integer>());
    }

    hm.get(line).add(num);

    num++;
}
对于(字符串line=file.readLine();line!=null;line=file.readLine()){ 如果(!hm.containsKey(行)) { hm.put(line,newarraylist()); } hm.get(行)。add(num); num++; }
我认为这应该行得通。

Integer num=0;
对于(字符串line=file.readLine();line!=null;line=file.readLine()){
如果(!hm.containsKey(行))
{
hm.put(line,newarraylist());
}
hm.get(行)。add(num);
num++;
}

我认为这应该行。

调用
al.add(num);
作为一个单独的语句,然后使用
map.put(line,num);
调用
al.add(num);
作为一个单独的语句,然后使用
map.put(line,num)
arraylist的add方法将始终返回true,但这有点吹毛求疵。它将返回true。但是布尔值的含义来自底层集合