Я предполагаю, что 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");
}