2016-11-11 74 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