Java 如何在迭代时添加到作为HashMap值的ArrayList?
我有一个HashMap,键的值是ArrayList。当我逐行读取文件时,我需要添加到属于该特定键的ArrayList中。 文件可能有1行或100万行,键名将是行(字符串),它的值将表示文件中出现的行号 有人能帮我吗?此外,这种快速时间复杂性明智吗?如果不是,我如何优化它 示例test.txt: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
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。但是布尔值的含义来自底层集合