2016-11-11 2 views
0

ВОПРОС:Для каждого цикла не печатается первая запрошенная линия

Когда я запускаю это, все работает нормально. Предположим, что мои выбранные ID: 0001, 0002, 0003, 0004. И их информация: info1, info2, info3, info4. Если я прохожу 0002 в сканере, я получаю информацию2. Как и следовало ожидать, но если я перейду в 0001, я ожидаю получить информацию1, но вместо этого ничего не получаю. Я пробовал это с массивом фиксированного размера 3, и он работал нормально. Я изменился на ArrayList, потому что не знаю, как долго будет файл. Почему это происходит?

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

Что моя программа делает, читается в файле и добавляет все строки в ArrayList, а затем запрашивает ввод от пользователя, вход должен быть в формате xxxx или 4 символа.

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

0001 
info1 
4 
0002 
info2 
5 
0003 
info3 
9 
0004 
info4 
10 
0005 
info5 
3 

Основной класс:

public class Main { 

    public static ArrayList<Gameobject> games = new ArrayList<>(); 

    public static void main(String[] args) throws IOException { 

     Scanner sc = new Scanner(new File("objects.txt")); 

     String id, info; 
     int amount; 

     while(sc.hasNextLine()) { 

      id = sc.nextLine(); 
      info = sc.nextLine(); 
      amount = Integer.parseInt(sc.nextLine()); 

      Gameobject s = new Gameobject(id, info, amount); 

      games.add(s); 
      System.out.println(s.getId()); 
     } 

     sc = new Scanner(System.in); 

     info(sc.next()); 

    } 

Информация метод не является, как следующим образом.

public static void info(String id){ 
    for(Gameobject s : games){  
     if(s.getId().equals(id)){ 
      System.out.println(s.getInfo()); 
     } 
    } 
} 

А класс геймобжекты

public class Gameobject { 

    String id, info; 
    int amount; 

    Gameobject(String id, String info, int amount) { 
     this.id = id; 
     this.info = info; 
     this.amount = amount; 
    } 
    public String getId() { 
     return id; 
    } 
    public void setId(String id) { 
     this.id = id; 
    } 
    public String getInfo() { 
     return info; 
    } 
    public void setInfo(String info) { 
     this.info = info; 
    } 
    public int getAmount() { 
     return amount; 
    } 
    public void setAmount(int amount) { 
     this.amount = amount; 
    } 
} 

Я сделал некоторые тесты и прошли в games.get(0).getId() методу информации, и она работала. Это дало мне идентификатор «0001» из Gameobject. Однако только прохождение в «0001» не было.

+2

Возможно, ваш файл 'objects.txt' имеет неправильный формат или что-то в этом роде. Пожалуйста, включите его в свой пост. – Lefteris008

+0

* «ВОПРОС - это все, что находится внизу». * Было бы гораздо лучше поставить его наверху. –

+0

@DavidWallace: Предположительно, он означает расширенный цикл 'for' в методе' info'. –

ответ

2

Я с Lefteris008 на этом. Проверьте objects.txt.

Ваши идентификаторы - это строки и внутри вашего цикла for вы сравниваете Gameobject.getId() с консольным вводом.

Имея ваш objects.txt содержат идентификатор 0001<space> вместо 0001 достаточно для .equals(id), чтобы получить false.

Если есть шанс, что ваш вклад будет неправильно сформирован, вы могли бы попытаться сделать код действовать более оборонительным:

// This will remove leading and trailing whitespaces 
id = sc.nextLine().trim(); 

Это просто, чтобы помочь вам получить представление о том, как обрабатывать ваши входные данные , Это далеко не готово к производству.

+0

Проверено на наличие дополнительных пробелов, а также добавлен метод .trim() в идентификатор, чтобы быть уверенным и ничего. –

+0

Итак, добавьте свой object.txt к вашему вопросу. Затем вы должны убедиться, что это не часть «read from input», дающая вам проблемы, заменив 'sc.next()' на '0001'. Вы пытались отладить свой код? – Oli

+0

@alexHexan вы говорите, что у вашего входного файла нет лишних пробелов, но я вижу дополнительное пространство в каждой отдельной строке. – dabadaba