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);