2016-12-06 26 views
0

Я хочу, чтобы программа распечатывала список смежности данного входа, используя карты и наборы. Сам вход должен быть ориентированным графом, и каждая строка должна быть ребро. Я хочу, чтобы пользователь вводил край ввода по краю, а затем вводил пустую строку для запуска программы. Я не могу проверить, работает ли это, потому что, когда я пытаюсь запустить программу и вводить пустую строку, курсор просто перемещается в следующую строку и не запускает программу. Я полагаю, что он должен что-то сделать с одним из моих циклов, но я не спешил ни на один час, ни на что не повезло. Что-нибудь помогает!Как я могу заставить свою программу прекратить прием входных данных и запустить программу?

import java.util.*; 

public class AdjList { 

    public static void main(String[] args) { 

     Map<String, Set<String>> graph = new TreeMap<String, Set<String>>(); 

     ArrayList<String> lines = new ArrayList<String>(); 

     boolean control = true; 
     while(control == true){ 
      Scanner in = new Scanner(System.in); 
      if (in.nextLine().length() == 0){ 
       control = false; 
      } else { 
       while (in.hasNextLine()) { 
        lines.add(in.nextLine()); 
        if (in.nextLine().length() == 0){ 
         break; 
        } 
       } 
       for (int i = 0; i < lines.size(); i++){ 
        String line = lines.get(i); 
        String[] vertices = line.split(" "); 
        if (graph.get(vertices[0]) == null){ 
         Set<String> newSet = new HashSet<String>(); 
         newSet.add(vertices[1]); 
         graph.put(vertices[0], newSet); 
        } else { 
         Set<String> oldSet = new HashSet<String>(); 
         oldSet = graph.get(vertices[0]); 
         oldSet.add(vertices[1]); 
         graph.put(vertices[0], oldSet); 
        } 
       } 
      } 
     } 
     for(String entry : graph.keySet()) { 
      System.out.println(entry + ":" + graph.get(entry)); 
     } 
    } 
} 

Пример того, что вход будет является:

A B 
C D 
B D 
E C 
E B 

А затем ввести пустую строку для запуска. Дайте мне знать, если вам нужна дополнительная информация.

+0

CTRL + D имитирует eof, я верю. Таким образом, вы можете сделать это! = Eof, и когда пользователь нажмет CTRL + D, он запустит – bpgeck

+0

@bpgeck. Я бы использовал это, но это задание, и мой профессор специально хочет, чтобы он запускался, когда вводилась пустая строка. Я сделал это раньше в прошлом задании, но не могу взломать его –

+0

Прежде всего, похоже, что вы пропустили первую строку ввода. Ваше заявление if перед else получает следующую строку и не присваивает ей ничего – bpgeck

ответ

1

Это в то время как петля проблема:

while (in.hasNextLine()) { 
    lines.add(in.nextLine()); 
    if (in.nextLine().length() == 0){ 
     break; 
    } 
} 

Каждый раз, когда вы делаете nextLine() перемещает указатель файла вперед так, в следующий раз, когда вы используете nextLine() это посмотреть на следующей строке. Таким образом, в этом цикле while он добавляет строку, переходит к следующей строке и затем проверяет, , что строка пуста. Вы должны сохранить линию, проверьте, если он пуст, и если это не так, то добавьте его в ArrayList, как так:

while (in.hasNextLine()) 
{ 
    String temp = in.nextLine(); 
    if (temp.length() == 0) 
     break; 
    else 
     lines.add(temp); 
} 

Даже с тем, что есть несколько других проблем в вашем коде. Например, нет необходимости в цикле while (control == true). Единственным способом управления всегда является ложь, если в первой строке нет символов. Я позволю вам найти остальную часть ошибок самостоятельно.

+0

Да, я понял, что будет, но спасибо! –