首頁  >  文章  >  使用者填入的陣列列表的永無止境的循環

使用者填入的陣列列表的永無止境的循環

WBOY
WBOY轉載
2024-02-05 22:00:051275瀏覽
問題內容

我需要編寫一個方法來取得使用者輸入的汽車規格並將它們新增至 arraylist 中。這需要接受用戶想要輸入的任何數量的規格,包括沒有。 這是我在這裡發表的第一篇文章,對於任何錯誤的語法表示歉意。

public static arraylist gettrim() {

scanner t = new scanner(system.in);
system.out.println("enter car trim");
arraylist<string> trim = new arraylist<>();

while (t.hasnext()) {
trim.add(t.next());
}

return trim;

}

我認為如果輸入空格,這個條件將會回傳 false。如此不斷迭代,只能手動退出。

我也嘗試過

if (t.hasNext()) {
trim.add(t.next());
}

else {
t.close();
}

這會迭代一次,然後返回 arraylist,但我需要能夠輸入更多內容。將 if 或 while 條件改為 hasnextline() 會得到相同的結果,這裡我使用 hasnext() 因為汽車裝飾等級有特定的格式期望。我不明白為什麼當沒有給出輸入時 hasnext() 不會回傳 false。


正確答案


它..沒有。

想一想。電腦如何區分正在考慮要輸入什麼內容並可能留到午餐後再輸入的使用者和已「完成」的使用者?啟動網路攝影機並進行一些人工智慧分析,看看用戶是否看起來覺得自己已經完成了打字?

system.in 不是鍵盤。它是“jvm 進程的標準輸入”,預設,至少,如果您從命令列啟動 java 應用程序,請設定為從鍵盤讀取。它不一定是:

java -jar myapp.jar </some/path/to/some/file.txt

現在 system.in 從該檔案讀取。無法從鍵盤讀取該過程。

java -jar myapp.jar </dev/barcodescanner1

現在,大概只要您掃描條碼,java 應用程式就會收到該條碼,就像您輸入該條碼的數字並按「回車」1 一樣。

這取決於「此輸入的來源」到「結束」。到達文件末尾時文件結束。

鍵盤不可能「結束」 - 因此,.hasnext() 不可能回傳 false

空白

您在評論中談到「輸入空格」。

那你就不懂scanner。你們有很好的夥伴;這可能是最容易被誤解的事。如果我們從 stackoverflow 中充斥的問題數量來看,確實如此。

scanner 與鍵盤無關

掃描器只取得任何文字輸入來源並將其分割成區塊。區塊稱為“令牌”,“令牌”由“分隔符號之間的所有文字”定義。分隔符號又由正規表示式定義,預設情況下使用的正規表示式是 \s 。例如,任意數量的空白。

因此:

public static void main(string[] args) {
  scanner s = new scanner(system.in);
  while (true) {
    system.out.println("token: ≥" + s.next()) + "≤");
  }
}

如果您執行該命令,並在命令列中輸入:hello world!,然後按enter 鍵,並輸入my name is lajos,您將看到:

token: ≥hello≤
token: ≥world!≤
token: ≥my≤
token: ≥name≤
token: ≥is≤
token: ≥lajos≤

關於掃描器的事情:不可能註冊或以其他方式取得「分隔符號」下的任何內容的內容。你不能問掃描器:有多少空白?

你也不能問:當你遇到空格時請「停止」。不,空格只是將一個標記與下一個標記分開。對於掃描器來說,按 enter 鍵和按空白鍵然後按 enter 鍵之間沒有任何差異。這都是“1 個或多個空白字元”,因此可以互換,並且因為這是關於分隔符號的,所以無法檢測到。

您可能根本不想使用掃描器。 system.in 本身當然可以區分它。

解決方案1

通常的策略是在提示中提及一些表示「完成」的神奇字。例如:

static void main(string[] args) throws exception {
  var s = new scanner(system.in);
  system.out.println("welcome to the fruit stand! enter the fruit you'd like to buy, one at a time:");

  var basket = new arraylist<string>();
  while (true) {
    system.out.print("fruit (type 'done' when done): ");
    string fruit = s.next();
    if (fruit.equalsignorecase("done")) break;
    basket.add(fruit);
  }

  system.out.println("here's your basket: " + basket);
}

解決方案2

溝渠掃描器。或者至少,放棄所有內容並僅使用nextline,它與它擁有的所有其他方法的交互非常 - 選擇一個且僅一個(nextline,或除nextline 之外的所有內容):

static void main(string[] args) throws exception {
  var s = new scanner(system.in);
  system.out.println("welcome to the fruit stand! enter the fruit you'd like to buy, one at a time:");

  var basket = new arraylist<string>();
  while (true) {
    system.out.print("fruit (enter when done): ");
    string fruit = s.nextline();
    if (fruit.isempty()) break;
    basket.add(fruit);
  }

  system.out.println("here's your basket: " + basket);
}

[1] 實際上,大多數條碼掃描器的外觀和行為都像鍵盤,並且沒有設備,因為它不存在於 /dev / 無法透過管道傳輸到這樣的進程中。但是,作為一個例子,它是有效的。

你可以嘗試這個:

public static ArrayList getTrim() {

Scanner t = new Scanner(System.in);
System.out.println("Enter car trim");
ArrayList<String> trim = new ArrayList<>();

while (t.hasNext()) {

if (!t.next().trim().equals("") {

trim.add(t.next());
      }

else {
t.close();
      }
   }

return trim;

}

以上是使用者填入的陣列列表的永無止境的循環的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除