我必须从文件中读取,所以:
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只有数字03
和2
,而之前的数字是不考虑的。为什么?
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;
}
}
即使在此之后,问题仍然存在相同
答案 0 :(得分:3)
每次调用reader.readLine()时,您都会移动到文件的下一行。
因此,当你打电话
Cliente cl=listaclienti.get(Integer.parseInt(reader.readLine()));
当你打算解析1107时,你实际上是移动到下一行并获得02。
答案 1 :(得分: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);
答案 2 :(得分: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));
答案 3 :(得分:0)
cl.getListaOrdini().put(Integer.parseInt(cod_ordine), ord);
因为您放入此地图的所有值都使用相同的密钥,即cod_ordine
,因此每次调用此方法时,都会将旧ordine
替换为新密码,这就是为什么您只需要有最后的记录。