Ошибка чтения текстового файла в Java - PullRequest
1 голос
/ 09 декабря 2011

Я должен читать из файла, поэтому сделал:

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

}

даже после этогоSuggets проблема остается той же

Ответы [ 4 ]

3 голосов
/ 09 декабря 2011

Каждый раз, когда вы вызываете reader.readLine (), вы переходите к следующей строке в файле.

Таким образом, когда вы вызываете

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

Вы фактически переходитеСледующая строка и получение 02, когда вы хотели разобрать 1107.

2 голосов
/ 09 декабря 2011

Я думаю, что в других ответах упущен смысл: вы хотите сопоставить идентификаторы заказа с пиццей.

Проблема в том, что карта (например, HashMap) должна иметь уникальное отображение для каждого ключа. Это означает, что вы можете сопоставить single Ordine с идентификатором заказа, карта не поддерживает наличие нескольких Ordine s для одного и того же идентификатора заказа.

Есть несколько способов обойти это. Вы можете создать новый объект, который содержит список Orders и поместить его на карту, или вы можете изменить свою карту, чтобы отобразить идентификатор заказа на 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 голосов
/ 09 декабря 2011
cl.getListaOrdini().put(Integer.parseInt(cod_ordine), ord);

потому что все значения, которые вы вводите в эту карту, используют один и тот же ключ, который равен cod_ordine, поэтому каждый раз, когда вы вызываете этот метод, вы заменяете старый ordine на новый, поэтому у вас есть только последняя запись.

0 голосов
/ 09 декабря 2011

Вы звонили 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));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...