String 将输入的文件转换为内部列表映射的映射

String 将输入的文件转换为内部列表映射的映射,string,java-8,hashmap,java-stream,String,Java 8,Hashmap,Java Stream,我从文件读取中得到如下输入 1|VegemiteScroll|VS5|3|6.99 2|VegemiteScroll|VS5|5|8.99 3|BlueberryMuffin|MB11|2|9.95 4|BlueberryMuffin|MB11|5|16.95 5|BlueberryMuffin|MB11|8|24.95 6|Croissant|CF|3|5.95 7|Croissant|CF|5|9.95 我想把它放在哈希表中,用下面的分组,让我们考虑一下1,2行。< /P> 该列

我从文件读取中得到如下输入

1|VegemiteScroll|VS5|3|6.99
2|VegemiteScroll|VS5|5|8.99

3|BlueberryMuffin|MB11|2|9.95
4|BlueberryMuffin|MB11|5|16.95
5|BlueberryMuffin|MB11|8|24.95

6|Croissant|CF|3|5.95
7|Croissant|CF|5|9.95



我想把它放在哈希表中,用下面的分组,让我们考虑一下1,2行。< /P>
该列表包含如上所述的地图列表。你能让我用java8流解决这个问题吗。提前谢谢

以下是用于此目的的代码。它没有得到充分优化。但它正在发挥作用

    import java.io.File;
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    import java.util.Scanner;

    /**
     * 
     */

    /**
     * @author KishorRaskar
     *
     */
    public class Main {

        /**
         * @param args
         * @throws Exception 
         */
        public static void main(String[] args) throws Exception {
            // pass the path to the file as a parameter 
            File file = 
              new File("C:\\Data\\FAB\\WorkSpace\\Test\\MyCode\\test.txt"); 
            Scanner sc = new Scanner(file); 
            List<HashMap> mapList = new ArrayList<>();
            HashMap<String, String> dataMap = null;
            HashMap<String, List<HashMap<String, String>>> dataMapList = new HashMap<>();

            while (sc.hasNextLine()) {
                String line = sc.nextLine();
                if(null == line || line.isEmpty()) {
                    continue;
                }
                String[] dataArray = line.split("\\|");
                //System.out.println(Arrays.toString(dataArray)); 
                String dataMapKey = dataArray[3].trim();
                String dataMapValue = dataArray[4].trim();
                String dataMapListKey = dataArray[2].trim();            
                if(!dataMapList.containsKey(dataMapListKey)) {
                    dataMapList.put(dataMapListKey, new ArrayList<>());
                    dataMapList.get(dataMapListKey).add(new HashMap<>());
                }
                dataMapList.get(dataMapListKey).get(0).put(dataMapKey, dataMapValue);
              //System.out.println(line); 
            }
            System.out.println("###############################");
            System.out.println(dataMapList);
            System.out.println("###############################");
          } 
    }
导入java.io.File;
导入java.util.ArrayList;
导入java.util.array;
导入java.util.HashMap;
导入java.util.List;
导入java.util.Map;
导入java.util.Scanner;
/**
* 
*/
/**
*@作者KishorRaskar
*
*/
公共班机{
/**
*@param args
*@抛出异常
*/
公共静态void main(字符串[]args)引发异常{
//将文件的路径作为参数传递
文件=
新文件(“C:\\Data\\FAB\\WorkSpace\\Test\\MyCode\\Test.txt”);
扫描仪sc=新扫描仪(文件);
List mapList=new ArrayList();
HashMap dataMap=null;
HashMap dataMapList=新HashMap();
while(sc.hasNextLine()){
字符串行=sc.nextLine();
if(null==line | | line.isEmpty()){
持续
}
String[]dataArray=line.split(“\\\\”);
//System.out.println(Arrays.toString(dataArray));
字符串dataMapKey=dataArray[3]。trim();
字符串dataMapValue=dataArray[4].trim();
字符串dataMapListKey=dataArray[2].trim();
如果(!dataMapList.containsKey(dataMapListKey)){
put(dataMapListKey,newarraylist());
get(dataMapListKey).add(newhashmap());
}
get(dataMapListKey).get(0).put(dataMapKey,dataMapValue);
//系统输出打印项次(行);
}
系统、输出、打印;
System.out.println(数据映射列表);
系统、输出、打印;
} 
}
输入:test.txt 1 |织女星卷轴| VS5 | 3 | 6.99 2 |织女星卷轴| VS5 | 5 | 8.99

3 |蓝莓松饼| MB11 | 2 | 9.95 4 |蓝莓松饼| MB11 | 5 | 16.95 5 |蓝莓松饼| MB11 | 8 | 24.95

6 |牛角面包| CF | 3 | 5.95 7 |牛角面包| CF | 5 | 9.95 8 |牛角面包| CF | 9 | 16.99

输出:

###############################

{CF=[{3=5.95,5=9.95,9=16.99}],MB11=[{2=9.95,5=16.95,8=24.95}],VS5=[{3=6.99,5=8.99}]
###############################

这里有一个使用Java8流、groupingBy和其他“奇特的东西”的解决方案。为了简单起见,我假设输入已经作为字符串提供

private static final int EXPECTED_LINE_ELEMENTS = 5;      
private static final int LINE_KEY_INDEX = 2;              
private static final int DATA_KEY_INDEX = 3;              
private static final int DATA_VALUE_INDEX = 4;            

private static Map<String, List<Map<Integer, Float>>> convert(final String input) {                                                                                            
    return Stream.of(input.split("\\n")) // split input by new line character                                                                                                  
        .filter(line -> !line.trim().isEmpty()) // filter out empty lines                                                                                                            
        .map(line -> line.split("\\|")) // split each line by '|' character                                                                                                          
        .filter(line -> line.length == EXPECTED_LINE_ELEMENTS) // filter out potential elements containing undesired number of columns                                   
        .collect(Collectors.groupingBy(line -> line[LINE_KEY_INDEX])) // convert to map using 3rd column as a key and a list of corresponding lines as values            
        .entrySet()                                                                                                                                                            
        .stream()                                                                                                                                                              
        .collect(                                                                                                                                                              
            Collectors.toMap(                                                                                                                                                  
                Map.Entry::getKey, // keep the same key                                                                                                                       
                stringListEntry -> Collections.singletonList(convertLinesToMap(stringListEntry.getValue())) // convert list of lines to a singleton list containing a map      
            )                                                                                                                                                                  
        );                                                                                                                                                                     
}                                                                                                                                                                              

private static Map<Integer, Float> convertLinesToMap(final List<String[]> lines) {                                                                                             
    return lines.stream()                                                                                                                                                      
        .collect(Collectors.toMap(                                                                                                                                             
            line -> Integer.valueOf(line[DATA_KEY_INDEX].trim()), // use 4th column as key of the map (mapped to Integer)                                                
            line -> Float.valueOf(line[DATA_VALUE_INDEX].trim())) // use 5th column as key of the map (mapped to Float)                                                  
        );                                                                                                                                                                     
}                                                                                                                                                                                                                                                                 

应打印以下内容:

{ CF =[{3=5.95, 5=9.95, 9=16.99}],  VS5 =[{3=6.99, 5=8.99}],  MB11 =[{2=9.95, 5=16.95, 8=24.95}]}
注:如你所写:

Map obj = new HashMap();
obj.put(3,6.99);
obj.put(5,8.99);

我假设您希望整数作为键,浮点作为值。如果不是这样,您可以只更新
convertlinetomap
方法的适当片段。

您就是star@Poger。很好,谢谢你的支持!:-)
System.out.println(convert(input));
{ CF =[{3=5.95, 5=9.95, 9=16.99}],  VS5 =[{3=6.99, 5=8.99}],  MB11 =[{2=9.95, 5=16.95, 8=24.95}]}
Map obj = new HashMap();
obj.put(3,6.99);
obj.put(5,8.99);