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开始
  • 为了你的实际问题