读取文本文件并将键值对存储在不同的映射中
Read the text file and store the key-value pairs in different maps
这是文本文件:
#Person
PRIM_KEY=personId
SEX=gender
YEARS=age
NAME=fullName
#Automobil
PRIM_KEY=registrationNumber
MAKE=manufacturer
TYPE=model
读取文件:
Scanner scanner = new Scanner(new FileReader("C:/workspace/column-mapping.txt"));
当我遇到#Person
时,在下面的映射中定义:
Map<String, String> personMap = new LinkedHashMap<String, String>();
我想把键值对存储在它下面。
所以将这些键值对存储在 personMap
:
PRIM_KEY=personId
SEX=gender
YEARS=age
NAME=fullName
同样遇到#Automobil
,如下图
Map<String, String> automobilMap = new LinkedHashMap<String, String>();
我想存储这些键值对:
PRIM_KEY=registrationNumber
MAKE=manufacturer
TYPE=model
当我读取文件时,如何将这些键值对存储在两个不同的映射中,在此示例中,取决于 #Person
和 #Automobil
?
编辑示例代码:
Scanner scanner = new Scanner(new FileReader("C:/workspace/column-mapping.txt"));
Map<String, String> personMap = new LinkedHashMap<String, String>();
Map<String, String> automobilMap = new LinkedHashMap<String, String>();
String line;
while (scanner.hasNext()) {
line = scanner.next();
if (!line.startsWith("#") && !line.isEmpty()) {
String[] columns = line.split("=");
personMap.put(columns[0], columns[1]);
}
}
System.out.println(personMap);
这样我就可以将所有键值对放在一个映射中 personMap
。但是根据部分,我希望能够将它放在不同的地图中。
不是最优雅的解决方案,但可以正常使用。
Scanner scanner = new Scanner(new FileReader("C:/workspace/column-mapping.txt"));
Map<String, String> personMap = new LinkedHashMap<String, String>();
Map<String, String> automobilMap = new LinkedHashMap<String, String>();
String line;
boolean person = false;
boolean automobil= false;
while (scanner.hasNext()) {
line = scanner.next();
if(line.startsWith("#Person") && !line.isEmpty()){
line = scanner.next();
person = true;
automobil = false;
}
if(line.startsWith("#Automobil") && !line.isEmpty()){
line = scanner.next();
automobil = true;
person = false;
}
if(person){
if (!line.startsWith("#") && !line.isEmpty()) {
String[] columns = line.split("=");
for(String str:columns){
System.out.println(str);
}
personMap.put(columns[0], columns[1]);
}
}
if(automobil){
if (!line.startsWith("#") && !line.isEmpty()) {
String[] columns = line.split("=");
for(String str:columns){
System.out.println(str);
}
automobilMap.put(columns[0], columns[1]);
}
}
}
System.out.println("personMap"+personMap);
System.out.println("automobilMap"+automobilMap);
我想向您推荐两种不同的方法。
第一种方法只是用一个 if 案例解决你的问题,在第二种方法中,我假设你想存储多个 Automobil 和多个 Person,所以我创建了两个 类 来解决这个问题。
我希望这有用,制作这段代码很有趣
第一种方法
public static void main(String args[]) throws FileNotFoundException{
Scanner scanner = new Scanner(new FileReader("C:/workspace/column-mapping.txt"));
Map<String, String> personMap = new LinkedHashMap<String, String>();
Map<String, String> automobilMap = new LinkedHashMap<String, String>();
String line= scanner.nextLine();
while(scanner.hasNext()){
Map<String, String> currentMap = null;
if(line.equals("#Person")){
currentMap=personMap;
}
if(line.equals("#Automobil")){
currentMap=automobilMap;
}
while(scanner.hasNext()){
line=scanner.nextLine();
if(line.startsWith("#"))
break; //restart the loop
String splitted[] = line.split("=");
currentMap.put(splitted[0], splitted[1]);
}
}
}
第二种方法
public static void main(String[] args) throws FileNotFoundException {
Scanner scanner = new Scanner(new FileReader("C:/workspace/column-mapping.txt"));
Map<String, Person> personMap = new LinkedHashMap<String, Person>();
Map<String, Car> automobilMap = new LinkedHashMap<String, Car>();
String line;
while (scanner.hasNextLine()) {
line = scanner.nextLine();
if(line.equals("#Person")){
String primaryKey = scanner.nextLine().split("=")[1];
String sex = scanner.nextLine().split("=")[1];
String years = scanner.nextLine().split("=")[1];
String name = scanner.nextLine().split("=")[1];
personMap.put(primaryKey, new Person(sex,years,name));
}
if(line.equals("#Automobil")){
String primaryKey = scanner.nextLine().split("=")[1];
String make = scanner.nextLine().split("=")[1];
String type = scanner.nextLine().split("=")[1];
automobilMap.put(primaryKey, new Car(make,type));
}
}
Set<String> personKeys = personMap.keySet();
Set<String> automobilKeys = automobilMap.keySet();
for(String k : personKeys){
System.out.println("Person: "+k);
System.out.println(personMap.get(k));
}
for(String k : automobilKeys){
System.out.println("Car: "+k);
System.out.println(automobilMap.get(k));
}
}
这两个类为第二种做法
public class Person {
boolean male; //true for male, false for female
int years;
String name;
String surname;
public Person(String gender, String age, String fullName){
if(gender.equals("male"))
male = true;
else
male = false;
years=Integer.parseInt(age);
String splitted[] = fullName.split(" ");
name = splitted[0];
surname = splitted[1];
}
@Override
public String toString(){
String gender = "male";
if(!male)
gender = "female";
return "SEX = "+gender+"\nYEARS = "+years+"\nNAME = "+name+" "+surname;
}
}
public class Car {
String make;
String type;
public Car(String manufacturer,String model){
make=manufacturer;
type=model;
}
@Override
public String toString(){
return "MAKE = "+make+"\nTYPE = "+type;
}
}
这是文本文件:
#Person
PRIM_KEY=personId
SEX=gender
YEARS=age
NAME=fullName
#Automobil
PRIM_KEY=registrationNumber
MAKE=manufacturer
TYPE=model
读取文件:
Scanner scanner = new Scanner(new FileReader("C:/workspace/column-mapping.txt"));
当我遇到#Person
时,在下面的映射中定义:
Map<String, String> personMap = new LinkedHashMap<String, String>();
我想把键值对存储在它下面。
所以将这些键值对存储在 personMap
:
PRIM_KEY=personId
SEX=gender
YEARS=age
NAME=fullName
同样遇到#Automobil
,如下图
Map<String, String> automobilMap = new LinkedHashMap<String, String>();
我想存储这些键值对:
PRIM_KEY=registrationNumber
MAKE=manufacturer
TYPE=model
当我读取文件时,如何将这些键值对存储在两个不同的映射中,在此示例中,取决于 #Person
和 #Automobil
?
编辑示例代码:
Scanner scanner = new Scanner(new FileReader("C:/workspace/column-mapping.txt"));
Map<String, String> personMap = new LinkedHashMap<String, String>();
Map<String, String> automobilMap = new LinkedHashMap<String, String>();
String line;
while (scanner.hasNext()) {
line = scanner.next();
if (!line.startsWith("#") && !line.isEmpty()) {
String[] columns = line.split("=");
personMap.put(columns[0], columns[1]);
}
}
System.out.println(personMap);
这样我就可以将所有键值对放在一个映射中 personMap
。但是根据部分,我希望能够将它放在不同的地图中。
不是最优雅的解决方案,但可以正常使用。
Scanner scanner = new Scanner(new FileReader("C:/workspace/column-mapping.txt"));
Map<String, String> personMap = new LinkedHashMap<String, String>();
Map<String, String> automobilMap = new LinkedHashMap<String, String>();
String line;
boolean person = false;
boolean automobil= false;
while (scanner.hasNext()) {
line = scanner.next();
if(line.startsWith("#Person") && !line.isEmpty()){
line = scanner.next();
person = true;
automobil = false;
}
if(line.startsWith("#Automobil") && !line.isEmpty()){
line = scanner.next();
automobil = true;
person = false;
}
if(person){
if (!line.startsWith("#") && !line.isEmpty()) {
String[] columns = line.split("=");
for(String str:columns){
System.out.println(str);
}
personMap.put(columns[0], columns[1]);
}
}
if(automobil){
if (!line.startsWith("#") && !line.isEmpty()) {
String[] columns = line.split("=");
for(String str:columns){
System.out.println(str);
}
automobilMap.put(columns[0], columns[1]);
}
}
}
System.out.println("personMap"+personMap);
System.out.println("automobilMap"+automobilMap);
我想向您推荐两种不同的方法。 第一种方法只是用一个 if 案例解决你的问题,在第二种方法中,我假设你想存储多个 Automobil 和多个 Person,所以我创建了两个 类 来解决这个问题。
我希望这有用,制作这段代码很有趣
第一种方法
public static void main(String args[]) throws FileNotFoundException{
Scanner scanner = new Scanner(new FileReader("C:/workspace/column-mapping.txt"));
Map<String, String> personMap = new LinkedHashMap<String, String>();
Map<String, String> automobilMap = new LinkedHashMap<String, String>();
String line= scanner.nextLine();
while(scanner.hasNext()){
Map<String, String> currentMap = null;
if(line.equals("#Person")){
currentMap=personMap;
}
if(line.equals("#Automobil")){
currentMap=automobilMap;
}
while(scanner.hasNext()){
line=scanner.nextLine();
if(line.startsWith("#"))
break; //restart the loop
String splitted[] = line.split("=");
currentMap.put(splitted[0], splitted[1]);
}
}
}
第二种方法
public static void main(String[] args) throws FileNotFoundException {
Scanner scanner = new Scanner(new FileReader("C:/workspace/column-mapping.txt"));
Map<String, Person> personMap = new LinkedHashMap<String, Person>();
Map<String, Car> automobilMap = new LinkedHashMap<String, Car>();
String line;
while (scanner.hasNextLine()) {
line = scanner.nextLine();
if(line.equals("#Person")){
String primaryKey = scanner.nextLine().split("=")[1];
String sex = scanner.nextLine().split("=")[1];
String years = scanner.nextLine().split("=")[1];
String name = scanner.nextLine().split("=")[1];
personMap.put(primaryKey, new Person(sex,years,name));
}
if(line.equals("#Automobil")){
String primaryKey = scanner.nextLine().split("=")[1];
String make = scanner.nextLine().split("=")[1];
String type = scanner.nextLine().split("=")[1];
automobilMap.put(primaryKey, new Car(make,type));
}
}
Set<String> personKeys = personMap.keySet();
Set<String> automobilKeys = automobilMap.keySet();
for(String k : personKeys){
System.out.println("Person: "+k);
System.out.println(personMap.get(k));
}
for(String k : automobilKeys){
System.out.println("Car: "+k);
System.out.println(automobilMap.get(k));
}
}
这两个类为第二种做法
public class Person {
boolean male; //true for male, false for female
int years;
String name;
String surname;
public Person(String gender, String age, String fullName){
if(gender.equals("male"))
male = true;
else
male = false;
years=Integer.parseInt(age);
String splitted[] = fullName.split(" ");
name = splitted[0];
surname = splitted[1];
}
@Override
public String toString(){
String gender = "male";
if(!male)
gender = "female";
return "SEX = "+gender+"\nYEARS = "+years+"\nNAME = "+name+" "+surname;
}
}
public class Car {
String make;
String type;
public Car(String manufacturer,String model){
make=manufacturer;
type=model;
}
@Override
public String toString(){
return "MAKE = "+make+"\nTYPE = "+type;
}
}