Используйте петлю while
.
Почему while
loop?
Обычно мы должны использовать while
циклы всегда, когда мы не знаем, сколько циклов мы сделаем. В этом случае только когда пользователь вводит «stop
».
Итак, вам нужно поле String
для хранения слов пользователя. Также мы можем использовать числовое поле, чтобы отследить, является ли первое или второе слово, подумав, добавив слово «не».
Затем посмотрите на этот пример:
Scanner s = new Scanner(System.in);
String currentAnswer = "";
String userWords = "";
int tracker = 0;
while (!currentAnswer.equals("stop")){
currentAnswer = s.nextLine();
userWords += currentAnswer + " ";
if (tracker % 2 != 0) {
userWords += "not ";
}
tracker++;
}
System.put.println(userWords);
Это можно сделать и с помощью цикла for, но я действительно рекомендую цикл while для этого случая.
РЕДАКТИРОВАТЬ: Как вы видели, я использовал equals()
вместо ==
, чтобы сравнить две строки, потому что мы хотим проверить его значение, а не равенство объектов.
Когда мы используем оператор ==
, мы пытаемся проверить, нацелены ли два объекта на один и тот же адрес памяти, но нам нужно только узнать, имеют ли две строки одно и то же значение.
Для этого случая справедливо знать, что мы можем сравнить его, используя другие способы, такие как Objects.equals()
или даже contentEquals()
.
Проверьте это обсуждение , чтобы узнать больше о сравнении строк.
Это могло бы казаться излишеством, но, здесь это идет:
import Queue, thread, subprocess
results= Queue.Queue()
def process_waiter(popen, description, que):
try: popen.wait()
finally: que.put( (description, popen.returncode) )
process_count= 0
proc1= subprocess.Popen( ['python', 'mytest.py'] )
thread.start_new_thread(process_waiter,
(proc1, "1 finished", results))
process_count+= 1
proc2= subprocess.Popen( ['python', 'mytest.py'] )
thread.start_new_thread(process_waiter,
(proc2, "2 finished", results))
process_count+= 1
# etc
while process_count > 0:
description, rc= results.get()
print "job", description, "ended with rc =", rc
process_count-= 1
Скрученный в Windows выполнит активное ожидание под покрытиями. Если Вы не хотите использовать потоки, необходимо будет использовать win32 API, чтобы не опрашивать. Что-то вроде этого:
import win32process
import win32event
# Note: CreateProcess() args are somewhat cryptic, look them up on MSDN
proc1, thread1, pid1, tid1 = win32process.CreateProcess(...)
proc2, thread2, pid2, tid2 = win32process.CreateProcess(...)
thread1.close()
thread2.close()
processes = {proc1: "proc1", proc2: "proc2"}
while processes:
handles = processes.keys()
# Note: WaitForMultipleObjects() supports at most 64 processes at a time
index = win32event.WaitForMultipleObjects(handles, False, win32event.INFINITE)
finished = handles[index]
exitcode = win32process.GetExitCodeProcess(finished)
procname = processes.pop(finished)
finished.close()
print "Subprocess %s finished with exit code %d" % (procname, exitcode)
Скрученный имеет асинхронный порождающий процесс API, который работает над Windows. Существует на самом деле несколько различных реализаций, многие из которых не являются настолько большими, но можно переключиться между ними, не изменяя код.
Основываясь на ответе zseil, можно сделать это с соединением подпроцесса и win32 вызовов API. Я использовал прямой ctypes, потому что мой Python, оказывается, не имеет установленный win32api. Я просто порождаю sleep.exe от MSYS здесь как пример, но ясно Вы могли породить любой процесс, который Вы любите. Я использую OpenProcess (), чтобы заставить ДЕСКРИПТОР от PID процесса и затем WaitForMultipleObjects ожидать любого процесса для окончания.
import ctypes, subprocess
from random import randint
SYNCHRONIZE=0x00100000
INFINITE = -1
numprocs = 5
handles = {}
for i in xrange(numprocs):
sleeptime = randint(5,10)
p = subprocess.Popen([r"c:\msys\1.0\bin\sleep.exe", str(sleeptime)], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=False)
h = ctypes.windll.kernel32.OpenProcess(SYNCHRONIZE, False, p.pid)
handles[h] = p.pid
print "Spawned Process %d" % p.pid
while len(handles) > 0:
print "Waiting for %d children..." % len(handles)
arrtype = ctypes.c_long * len(handles)
handle_array = arrtype(*handles.keys())
ret = ctypes.windll.kernel32.WaitForMultipleObjects(len(handle_array), handle_array, False, INFINITE)
h = handle_array[ret]
ctypes.windll.kernel32.CloseHandle(h)
print "Process %d done" % handles[h]
del handles[h]
print "All done!"