将文本文件加载到HashMap和索引元素中

时间:2016-04-22 11:13:01

标签: java hashmap

我有一个具有以下结构的汽车文本文件:     21     沃克斯豪尔     科萨     红色

19
Vauxhall
Corsa
blue

18
Vauxhall
Corsa
White

我可以将它加载到HashMap中,但是当我加载它时,它会将每个新行索引为一个新元素。如何在每4行之后改变它,它会编入索引? 有没有办法让我可以加载到以下元素中:

id
Manufacturer
carMake
carColour

6 个答案:

答案 0 :(得分:0)

希望这是你想要的......

public static void main(String[] args) throws IOException {
    Map<Integer, String> map = new HashMap<Integer, String>();
    BufferedReader reader = new BufferedReader(new FileReader("/home/Desktop/cars.txt"));
    String line = "";
    int i = 0;
    while (line != null) {
        String data = "";
        for (int k = 0; k < 4; k++) {
            data = data + "," + reader.readLine();
            if (k == 3)
                map.put(i, data);
        }
        line = reader.readLine();
        i++;
    }
    System.out.println(map);
}

答案 1 :(得分:0)

您应该为Car创建一个新的POJO类,然后填充从该POJO中的文本文件中读取的数据。

此外,我没有看到任何HashMap的使用,因为您只是将增加的计数器添加为键。您可以改为使用HashSet

以下是代码段

public class Car {

    private int id;
    private String manufacturer;
    private String carMake;
    private String carColour;

    /* Getter Setters */
}

主类:

Set<Car> set= new HashSet<>();

BufferedReader reader = new BufferedReader(new FileReader("cars.txt"));

String line = "";
while (line != null) {
    Car car = new Car();

    line = reader.readLine();
    car.setId(line != null ? reader.readLine() : 0);

    line = reader.readLine();
    car.setManufacturer(line != null ? reader.readLine() : null);

    line = reader.readLine();
    car.setCarMake(line != null ? reader.readLine() : null);

    line = reader.readLine();
    car.setCarColour(line != null ? reader.readLine() : null);

    set.add(car);
}

答案 2 :(得分:0)

如果您不想使用这四个元素创建Car对象,则可以使用MapInteger的{​​{1}}来执行此操作。

List<String>

答案 3 :(得分:0)

你写的内容会将每一行视为同一个字符串作为字符串,因此,您将它放在地图中。 Java是OOP,因此使用它,创建一个对象,为汽车字符串组中的每一行放置4个变量,然后使用这些对象的HashMap。像:

public class Car {
private int id;
private String something;
private String type;
private String collor;

public int getId() {
    return id;
}
public void setId(int id) {
    this.id = id;
}
public String getSomething() {
    return something;
}
public void setSomething(String something) {
    this.something = something;
}
public String getType() {
    return type;
}
public void setType(String type) {
    this.type = type;
}
public String getCollor() {
    return collor;
}
public void setCollor(String collor) {
    this.collor = collor;
}

@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;
    Car car = (Car) o;
    return id == car.id;

}

@Override
public int hashCode() {
    return id;
}

@Override
public String toString() {
    return "Car{" +
            "id=" + id +
            ", something='" + something + '\'' +
            ", type='" + type + '\'' +
            ", collor='" + collor + '\'' +
            '}';
}

}

确保在这些对象中有toString,hashCode和equals方法,它们非常重要!

答案 4 :(得分:0)

创建一个Car bean并给它一个构造函数来构建读取文件行的​​对象。

创建后,Car会将自己添加到地图中。

static class Car{
    String id;
    String Manufacturer;
    String carMake;
    String carColour;

    public Car(BufferedReader reader, Map<Integer, Car> map) throws Exception{
        id = readLine(reader);
        Manufacturer = readLine(reader);
        carMake = readLine(reader);
        carColour = readLine(reader);
        map.put(map.size(), this);
    }

    private String readLine(BufferedReader reader) throws Exception{
        String s = reader.readLine();
        if(s == null){
            throw new Exception("No more line...");
        }
        return s;
    }
}

public static void main(String[] args) {
    try{
        Map<Integer, Car> map = new HashMap<Integer, Car>();
        BufferedReader reader = new BufferedReader(new FileReader("cars.txt"));
        try{
            while (true) {
                new Car(reader, map);
            }
        }catch(Exception e){
            // Will be thrown at the end ov the file
        }
        for(int j=0;j<map.size();j++){
            System.out.println(map.get(j));
        }
        System.out.println(map);
    }catch(Exception e){
        e.printStackTrace();
    }
}   

答案 5 :(得分:0)

首先,你应该明白你在做什么。

这个循环用于读取文件,读取每一行并放入索引i下的地图中(它不关心实际得到的内容)。

while (line != null) {
    line = reader.readLine();
    map.put(i,line);
    i++;
}

因此,为了您的目的,您需要辨别您在该循环中除了哪些数据。

{
    id = reader.readLine();
    Manufacturer = reader.readLine();
    carMake = reader.readLine();
    carColour = reader.readLine();
    reader.readLine();                   //empty space between data
    ...
}

当然最好检查一下你是否收到任何数据,比如将它放入if语句中。

您的下一步应该是决定如何存储该数据。有很多方法可以做到这一点。例如,您也可以使用另一个hashMap

Map<Integer, Map<String>> map = new HashMap<>();    
...
{
    ...
    Map<String, String> car = new HashMap<>();    
    car.put("id", id);
    car.put("manufacturer", manufacturer);
    car.put("model", carMake);
    car.put("color", carColor);

    map.put(i, car);
}

编辑: 几乎忘了,因为你的文件在每个汽车数据之间有空格,所以需要读取该空行并忽略它