Java 如何动态创建HashMap
我有一个Java 如何动态创建HashMap,java,Java,我有一个.txt文件,文件中的5L值(行)如下所示,并且分区大小50000 1 3 -1546.9 -67.90 3456 . . . 通过下面的例子,您可以理解在我看来分区意味着什么 将文件数据导入列表后,我们可以通过以下方式看到 importingdata={1,2,3,4,5,.........500000}; PartitionList={{1,2,3,...50000},{50001,....,100000},{100001,......,150000},...{450000
.txt
文件,文件中的5L值(行)如下所示,并且分区大小50000
1
3
-1546.9
-67.90
3456
.
.
.
通过下面的例子,您可以理解在我看来分区意味着什么
将文件数据导入列表后,我们可以通过以下方式看到
importingdata={1,2,3,4,5,.........500000};
PartitionList={{1,2,3,...50000},{50001,....,100000},{100001,......,150000},...{450000,.....500000}};
PartitionList={{1->1,2->2,3->3,...,50000->50000},{1->50001,.....,50000->100000},{1->100001,....,50000->150000},...,{1->450000,.....,50000->500000}};
分区后,您可以通过以下方式看到
importingdata={1,2,3,4,5,.........500000};
PartitionList={{1,2,3,...50000},{50001,....,100000},{100001,......,150000},...{450000,.....500000}};
PartitionList={{1->1,2->2,3->3,...,50000->50000},{1->50001,.....,50000->100000},{1->100001,....,50000->150000},...,{1->450000,.....,50000->500000}};
partitionList数据类型是ArrayList
。这意味着partitionList的所有子列表都是HashMap
所有HashMap
列表的键值从1到50000开始。如下所示
importingdata={1,2,3,4,5,.........500000};
PartitionList={{1,2,3,...50000},{50001,....,100000},{100001,......,150000},...{450000,.....500000}};
PartitionList={{1->1,2->2,3->3,...,50000->50000},{1->50001,.....,50000->100000},{1->100001,....,50000->150000},...,{1->450000,.....,50000->500000}};
我想在文件导入时按上述方式排列文件数据
为此,我尝试使用示例代码,但它不起作用
public static void main(String[] args) {
ArrayList<HashMap<Integer, Double>> finalList=new ArrayList<>();
HashMap<Integer, Double> hash1=new HashMap<>();
hash1.put(1, 1.0);
hash1.put(2, 2.0);
hash1.put(3, 3.0);
finalList.add(hash1);
System.out.println(finalList.size());
System.out.println(hash1.size());
hash1.clear();
System.out.println(hash1.size());
hash1.put(1, 1.0);
hash1.put(2, 2.0);
hash1.put(3, 3.0);
finalList.add(hash1);
System.out.println(finalList.size());
System.out.println(hash1.size());
hash1.clear();
System.out.println(hash1.size());
HashMap<Integer, Double> hash2=finalList.get(1);
HashMap<Integer, Double> hash3=finalList.get(2);
System.out.println(hash2.size());
System.out.println(hash3.size());
}
publicstaticvoidmain(字符串[]args){
ArrayList finalList=新的ArrayList();
HashMap hash1=新的HashMap();
hash1.put(1,1.0);
hash1.put(2,2.0);
hash1.put(3,3.0);
finalList.add(hash1);
System.out.println(finalList.size());
System.out.println(hash1.size());
hash1.clear();
System.out.println(hash1.size());
hash1.put(1,1.0);
hash1.put(2,2.0);
hash1.put(3,3.0);
finalList.add(hash1);
System.out.println(finalList.size());
System.out.println(hash1.size());
hash1.clear();
System.out.println(hash1.size());
HashMap hash2=finalList.get(1);
HashMap hash3=finalList.get(2);
System.out.println(hash2.size());
System.out.println(hash3.size());
}
我希望你们能理解我的想法。
这里我提到了5L
行,但在我的实际案例中,我处理的是80L
,所以建议我使用优化的代码
谢谢,HashMap是可变的哈希映射引用仍然相同。执行此操作时:
hash1.clear();
您可以清除原始贴图实例。这意味着,您放入列表中的映射实例将被清除
你应该这样做
hash1 = new HashMap<Integer, Double>();
hash1=newhashmap();
相反。这将更新变量对HashMap()新实例的引用。HashMap是可变的哈希映射引用仍然相同。执行此操作时:
hash1.clear();
您可以清除原始贴图实例。这意味着,您放入列表中的映射实例将被清除
你应该这样做
hash1 = new HashMap<Integer, Double>();
hash1=newhashmap();
相反。这会将变量的引用更新为HashMap()的新实例。publicstaticvoidmain(String[]args){
List finalList=new ArrayList();
Map hash1=新的HashMap();
hash1.put(1,1.0);
hash1.put(2,2.0);
hash1.put(3,3.0);
finalList.add(hash1);
System.out.println(finalList.size());
System.out.println(hash1.size());
hash1=新的HashMap();
System.out.println(hash1.size());
hash1.put(1,1.0);
hash1.put(2,2.0);
hash1.put(3,3.0);
finalList.add(hash1);
System.out.println(finalList.size());
System.out.println(hash1.size());
//等等
}
公共静态void main(字符串[]args){
List finalList=new ArrayList();
Map hash1=新的HashMap();
hash1.put(1,1.0);
hash1.put(2,2.0);
hash1.put(3,3.0);
finalList.add(hash1);
System.out.println(finalList.size());
System.out.println(hash1.size());
hash1=新的HashMap();
System.out.println(hash1.size());
hash1.put(1,1.0);
hash1.put(2,2.0);
hash1.put(3,3.0);
finalList.add(hash1);
System.out.println(finalList.size());
System.out.println(hash1.size());
//等等
}
示例代码存在一些问题
将50000个条目添加到hashmap中后,需要创建hashmap的新实例。要求清场对你的案子没有帮助
由于您在创建HashMap时非常清楚HashMap的大小,因此请确保传递初始大小。提供初始尺寸可防止影响性能的频繁重新灰化
HashMap hash1=新的HashMap(50000)代码>
我不知道这是不是打字错误。在示例代码中,您试图调用get(1),而列表索引从0开始,而不是从1开始
对于您的实际问题,您应该看看GoogleCollections2API。请在下面找到帮助您实现最终目标的代码
// Read all 80Lac lines
List<String> allLines = Files.readAllLines(
new File("d:/input.txt").toPath(), Charset.defaultCharset());
// Partition the 80L records into lists of 50000
List<List<String>> partitionedLists = Lists.partition(allLines, 50000);
ArrayList<ListMultimap<Integer, String>> finalList = new ArrayList<ListMultimap<Integer,String>>();
for(final List<String> item: partitionedLists){
ListMultimap<Integer, String> finalMap = Multimaps.index(item.iterator(), new Function<String,Integer>(){
@Override
public Integer apply(String arg0) {
return item.indexOf(arg0);
}
});
finalList.add(finalMap);
}
//读取所有80Lac行
列出所有行=文件。readAllLines(
新文件(“d:/input.txt”).toPath(),Charset.defaultCharset();
//将80L记录划分为50000个列表
List partitionedLists=Lists.partition(所有行,50000);
ArrayList finalList=新的ArrayList();
对于(最后一个列表项:PartitionedList){
ListMultimap finalMap=Multimaps.index(item.iterator(),new Function(){
@凌驾
公共整数应用(字符串arg0){
返回项目。indexOf(arg0);
}
});
添加(finalMap);
}
甚至我对CollectionsAPI都是新手,但我测试了上面的代码,它确实创建了一个以key作为索引的映射列表。唯一的问题是,多重映射通常用于实现分组操作,因此重复值被分组在一起。我正在研究它,但与此同时,您可以使用上述代码开始实现。示例代码存在一些问题
将50000个条目添加到hashmap中后,需要创建hashmap的新实例。要求清场对你的案子没有帮助
由于您在创建HashMap时非常清楚HashMap的大小,因此请确保传递初始大小。提供初始尺寸可防止影响性能的频繁重新灰化
HashMap hash1=新的HashMap(50000)代码>
我不知道这是不是打字错误。在示例代码中,您试图调用get(1),而列表索引从0开始,而不是从1开始
为了你的实际问题