2016-11-11 78 views
0

ISSUE:For-each loop will not print the first requested line

當我運行這個時,一切工作正常。 假設我選擇的ID是:0001,0002,0003,0004. 以及它們的信息:info1,info2,info3,info4。 如果我在掃描儀中通過0002,我會得到info2。正如你所期望的,但如果我通過0001,我期望得到info1,但是我什麼也得不到。我嘗試了一個固定大小的數組3,它工作得很好。我改變了一個ArrayList,因爲我不知道這個文件會有多長。爲什麼會發生?

我是一個編程新手,所以請原諒我缺乏關於在哪裏尋找這些東西的知識。

我的程序所做的是讀取文件並將所有行添加到ArrayList,然後要求用戶輸入,輸入格式應爲xxxx或4個字符。

我做了作爲一個例子如下所示,上線沒有多餘的空格的文本文件:

0001 
info1 
4 
0002 
info2 
5 
0003 
info3 
9 
0004 
info4 
10 
0005 
info5 
3 

主類:

public class Main { 

    public static ArrayList<Gameobject> games = new ArrayList<>(); 

    public static void main(String[] args) throws IOException { 

     Scanner sc = new Scanner(new File("objects.txt")); 

     String id, info; 
     int amount; 

     while(sc.hasNextLine()) { 

      id = sc.nextLine(); 
      info = sc.nextLine(); 
      amount = Integer.parseInt(sc.nextLine()); 

      Gameobject s = new Gameobject(id, info, amount); 

      games.add(s); 
      System.out.println(s.getId()); 
     } 

     sc = new Scanner(System.in); 

     info(sc.next()); 

    } 

信息方法是如下。

public static void info(String id){ 
    for(Gameobject s : games){  
     if(s.getId().equals(id)){ 
      System.out.println(s.getInfo()); 
     } 
    } 
} 

和類遊戲對象

public class Gameobject { 

    String id, info; 
    int amount; 

    Gameobject(String id, String info, int amount) { 
     this.id = id; 
     this.info = info; 
     this.amount = amount; 
    } 
    public String getId() { 
     return id; 
    } 
    public void setId(String id) { 
     this.id = id; 
    } 
    public String getInfo() { 
     return info; 
    } 
    public void setInfo(String info) { 
     this.info = info; 
    } 
    public int getAmount() { 
     return amount; 
    } 
    public void setAmount(int amount) { 
     this.amount = amount; 
    } 
} 

我做了一些測試,並在games.get(0).getId()傳遞給信息的方法和它的工作。這讓我從Gameobject獲得了ID「0001」。然而,只是通過「0001」沒有。

+2

也許你的'objects.txt'文件格式不正確。請將其添加到您的帖子中。 – Lefteris008

+0

*「問題始終處於最底層。」*將其置於頂端會好得多。 –

+0

@DavidWallace:推測他是指'info'方法中增強的'for'循環。 –

回答

2

我與Lefteris008在這一個。檢查你的objects.txt

您的ID是字符串,在for循環中您將Gameobject.getId()與控制檯輸入進行比較。

有您objects.txt包含ID 0001<space>而不是0001是足夠.equals(id)產生false

如果有機會,你的輸入將被畸形,你可以嘗試讓你的代碼的行爲更具防禦性:

// This will remove leading and trailing whitespaces 
id = sc.nextLine().trim(); 

這只是幫助你如何處理輸入數據的想法。這遠遠沒有準備好生產。

+0

檢查是否有多餘的空格,並且還爲該ID添加了一個.trim()方法,以確保沒有任何問題。 –

+0

好的,請將您的objects.txt添加到您的問題中。接下來你應該確保它不是'讀取輸入'部分,通過'0001'替換'sc.next()'給你帶來麻煩。你有沒有試過調試你的代碼? – Oli

+0

@alexHexan你說你的輸入文件沒有多餘的空格,但我在每一行看到一個額外的空間 – dabadaba