Эта программа просто принимает ввод от пользователя, но не отображает вывод. Не вылезаю из в то время как l oop в основной функции - PullRequest
0 голосов
/ 04 августа 2020

Я не выхожу из while l oop в основном методе (while (! StdIn.isEmpty ()) Я пробовал все комбинации, чтобы создать дерево, и я подключил все компоненты, которые все еще запрашивают ввод. I ' m впервые в java и скопировал этот код из книги. Я понимаю большую часть этого, но не библиотеки StdIn и StdOut.

public class UF {
    private int[] id;
    private int count;
    
    public UF(int N) {
        count = N;
        id = new int[N];
        for(int i=0;i<N;i++)
            id[i]=i;
    }
    
    public int count() {
        return count;
    }
    
    public boolean connected(int p,int q) {
        return find(p)==find(q);
    }
    
    //find method
    public int find(int p) {
        while (p!=id[p]) p = id[p];
        return p;
    }
    
    //union method
    public void union(int p,int q) {
        int pRoot = find(p);
        int qRoot = find(q);
        if(pRoot == qRoot) return;
        id[pRoot] = qRoot;
            count--;
        }
    

    public static void main(String[] args) {
        
        int N = StdIn.readInt();
        UF uf = new UF(N);
        while(!StdIn.isEmpty()) {
            
            int p = StdIn.readInt();
            int q = StdIn.readInt();
            if(uf.connected(p, q)) continue;
            uf.union(p, q);
            StdOut.println(p +" "+q);
        }
        StdOut.println(uf.count() + "components");

    }

}

1 Ответ

0 голосов
/ 04 августа 2020

Я предполагаю, что StdIn находится в какой-то обертке вокруг сканера, или, по крайней мере, в системном вводе.

Предполагая, что системный ввод не перенаправлен из файла, IsEmpty() просто не имеет значения. По сути, никогда не происходит - большинство стандартных входных потоков буквально бесконечно.

Если вы запустите свое приложение следующим образом:

java -cp myclasspath com.foo.MyApp <somefile.txt

, тогда стандартный in может быть «пустым» - это происходит, когда в somefile.txt заканчивается материал. Но если вы просто запустите его как обычно, например:

java -cp myclasspath com.foo.MyApp

Стандартный ввод терминала среды подключается как system in, которым обычно является ваша клавиатура, которая бесконечна, на по крайней мере, до тех пор, пока вы не нажмете символ «завершить поток», который обычно является CTRL + C.

Это своего рода дерьмовый интерфейс.

Намного более приятным решением является определение альтернативной команды который можно ввести вместо обычного ввода, чтобы сигнализировать о том, что все готово. Например, укажите, что ввод 0 для p и q является условием выхода. Затем:

public static void main(String[] args) {
        
        int N = StdIn.readInt();
        UF uf = new UF(N);
        while(true) {
            
            int p = StdIn.readInt();
            int q = StdIn.readInt();
            if (p == 0 && q == 0) break; // -- ADD THIS LINE --
            if(uf.connected(p, q)) continue;
            uf.union(p, q);
            StdOut.println(p +" "+q);
        }
        StdOut.println(uf.count() + "components");

    }

в качестве альтернативы, возможно, представление о том N, которое вы читаете сразу же, указывает, сколько p и q вы хотите прочитать. В этом случае:

public static void main(String[] args) {
        
        int N = StdIn.readInt();
        UF uf = new UF(N);
        for (int i = 0; i < N; i++) { // -- THIS IS CHANGED --
            int p = StdIn.readInt();
            int q = StdIn.readInt();
            if(uf.connected(p, q)) continue;
            uf.union(p, q);
            StdOut.println(p +" "+q);
        }
        StdOut.println(uf.count() + "components");
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...