如何让我的程序停止接受输入并运行程序?

时间:2016-12-06 03:47:37

标签: java java.util.scanner directed-graph adjacency-list

我希望程序使用地图和集打印出给定输入的邻接列表。输入本身应该是有向图,并且每条线应该是边缘。我希望用户逐个输入边缘输入,然后输入一个空行来运行程序。我无法测试是否有效,因为当我尝试运行程序并输入一个空行时,光标只会移动到下一行并且不会运行该程序。我认为它必须与我的一个while循环做一些事情,但我已经修补了一个小时左右没有运气。一切都有帮助!

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

然后输入一个空行来运行。如果您需要更多信息,请与我们联系。

1 个答案:

答案 0 :(得分:1)

这个while循环是问题所在:

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)循环。控件永远错误的唯一方法是第一行没有字符。我会让你自己找到其余的错误。