2011-12-09 24 views
1

我从文件中读取,这样做:错误读取文本文件在Java中

cod_order (int) 
cod_cliente (int) 
cod_pizza (int) 
num_pizza (int) 
cod_pizza 
num_pizza 
... 
$FINE 

这里有一个例子:

1 
1107 
02 
1 
01 
5 
03 
2 
$FINE 

我创造了这个方法从这个文本文件中读取:

private void loadOrdini(String fname){ 

    try{ 

     BufferedReader reader = new BufferedReader(new FileReader(fname)); 

     String cod_ordine = reader.readLine(); 
     while(cod_ordine!=null){ 

      String cod_cliente=reader.readLine(); 

      Cliente cl=listaclienti.get(Integer.parseInt(cod_cliente)); 

      String cod_pizza=reader.readLine(); 
      while(!cod_pizza.equals("$FINE")){ 

       String n_pizze=reader.readLine(); 

       Ordine ord = new Ordine(Integer.parseInt(cod_pizza),Integer.parseInt(n_pizze)); 

       cl.getListaOrdini().put(Integer.parseInt(cod_ordine), ord); 

       cod_pizza=reader.readLine(); 

      } 

      cod_ordine=reader.readLine(); 
     } 

    } 
    catch(IOException ioe){ 

     ioe.printStackTrace(); 
    } 

} 

问题是该方法负载到HashMap中listaordini唯一的数字032而以前的数字不考虑,为什么?

import java.util.*; 

public class Cliente{ 

private String name; 
private String address; 

private Map<Integer,Ordine> listaordini; 

public Cliente(String n,String addr){ 

    name=n; 
    address=addr; 

    listaordini=new HashMap<Integer,Ordine>(); 
} 

public String getName(){ 

    return name; 
} 

public String getAddr(){ 

    return address; 
} 

public Map<Integer,Ordine> getListaOrdini(){ 

    return listaordini; 
} 

public String toString(){ 

    String temp=""; 

    temp+="Nome Cliente: "+name; 
    temp+="\nIndirizzo: "+address; 

    return temp; 
} 

} 

即使这个suggets问题仍然调用reader.readLine(),您正在移动到文件中的下一行的相同

+0

如果我正确理解你的代码,你的地图'listaordini'应该是您的订单ID映射到比萨的订单? – Mac

+0

是的,这是对的 – Mazzy

回答

2

我认为其他答案已经错过了观点:你想要一个从订单ID到比萨饼的映射。

问题是,映射(如HashMap)必须具有每个键的唯一映射。这意味着,您只能将单一Ordine映射到订单ID,对于相同的订单ID,映射不支持具有多个Ordine

有几种解决方法。您可以创建一个包含Orders列表的新对象,并将其放入地图中,或者可以更改地图以将订单ID映射到订单的List

例如,做你将有第二个办法:

// To create your map: 
Map<Integer, List<Ordine>> listaordini = new HashMap<Integer, List<Ordine>>(); 



// To add an order to it: 
Ordine ord = new Ordine(Integer.parseInt(cod_pizza),Integer.parseInt(n_pizze)); 

List<Ordine> ordineList = cl.getListaOrdini().get(Integer.parseInt(cod_ordine)); 
if (ordineList == null) 
{ 
    ordineList = new ArrayList<Ordine>(); 
    cl.getListaOrdini().put(Integer.parseInt(cod_ordine), ordineList); 
} 

ordineList.add(ord); 
+0

谢谢你,那就是问题。我试图用一个唯一的键来映射很多顺序,这对于地图的性质来说是不可能的。 – Mazzy

+0

不客气!总是乐于帮助! – Mac

3

每次。

因此,当你调用

Cliente cl=listaclienti.get(Integer.parseInt(reader.readLine())); 

你实际上是移动到下一行,并获得02当你的意思是解析1107

+0

我该如何解决它? – Mazzy

+0

是的,@Mazzy当你做'String cod_cliente = reader.readLine()'时,你已经阅读过包含“1107”的'cod_cliente'行 - '然后你试着再读*,但是你实际上正如Meursault指出的那样阅读“02”。做'listaclienti.get(cod_cliente)',因为你已经有了这个价值。 –

0

你叫readLine()太多次:

String cod_ordine = reader.readLine(); 
    while(cod_ordine!=null){ 

     String cod_cliente=reader.readLine(); 

     Cliente cl=listaclienti.get(Integer.parseInt(reader.readLine())); 

您填写cod_ordine并拨打第一个readLine()

您填写cod_cliente与第二个readLine()调用。

创建与第三readLine()调用客户对象 - 使用的是什么应该一直是cod_pizza值作为客户价值。

试试这个:

String cod_ordine = reader.readLine(); 
    while(cod_ordine!=null){ 

     String cod_cliente=reader.readLine(); 

     Cliente cl=listaclienti.get(Integer.parseInt(cod_cliente)); 
+0

好的我解决了它,但问题仍然存在。它只加载了文件的最后两个值 – Mazzy

0
cl.getListaOrdini().put(Integer.parseInt(cod_ordine), ord); 

,因为所有你把这个地图的价值使用相同的密钥,这是cod_ordine,所以每次调用这个方法,你替换旧ordine新一,这就是为什么你只有最后一个记录。

+0

我不确定。当我创建对象时,我把它存入散列表 – Mazzy