TreeSet上的迭代器会导致无限循环

时间:2018-04-24 00:34:42

标签: java collections iterator infinite-loop treeset

对于此分配,我需要将每个包含2个字符串的自定义数据类(称为User)的实例保存到TreeSet中。然后,我必须搜索我为从另一个文件的每一行获取的字符串创建的TreeSet。第一个文件是.csv文件,其中每行包含一个电子邮件地址和一个名称,.txt文件仅包含地址。我必须在.txt文件中搜索每一行,我还必须重复整个操作4000次。

我无法使用.contains搜索TreeSet,因为我无法按用户搜索,因为.txt文件只包含用户所做的两条信息之一。根据我在各个地方发现的信息,我可以从我的TreeSet中获取迭代器并使用它来检索其中的每个用户,然后获取用户的用户名并进行比较直接到第二个文件的字符串。我完全按照我发现的每个网站编写了我的代码,但是我的程序仍然陷入无限循环。这是我到目前为止的搜索代码:

for (int i = 0; i < 4000; i++)//repeats search operation 4000 times
{
  try
  {
    BufferedReader fromPasswords = new BufferedReader(new FileReader("passwordInput.txt"));

    while ((line = fromPasswords.readLine()) != null)
    {
      Iterator it = a.iterator();
      while (it.hasNext())
      {
        //the infinite loop happens about here, if I put a println statement here it prints over and over
        if(it.next().userName.compareTo(line) == 0)
          matches++; //this is an int that is supposed to go up by 1 every time a match is found
      }
    }
  }
  catch (Exception e)
  {
    System.out.println("Error while searching TreeSet: " + e);
    System.exit(0);
  }
}

有关其他信息,请参阅我的用户类。

class User implements Comparable<User>
{
  String userName;
  String password;

  public User() { userName = "none"; password = "none"; }
  public User(String un, String ps) { userName = un; password = ps; } 

  public int compareTo(User u)
  {
    return userName.compareToIgnoreCase(u.userName);
  }
} //User

我已经完成了所有看似正确的事情,但在我看来,即使我调用next(),迭代器也不会移动它的指针。有没有人看到我失踪的东西?

编辑:感谢KevinO指出这一点 - 一个是TreeSet的名称。

编辑:这是TreeSet的声明。

TreeSet<User> a = new TreeSet<User>();

1 个答案:

答案 0 :(得分:0)

你确定那是一个无限循环吗?您正在打开文件4000次,并为文件中的每一行迭代一个集合。根据文件的大小和集合,这可能需要很长时间。

其他一些需要注意的事项:

  • Java的更高版本有一种更简洁的方式来打开文件并遍历所有行:Files.lines
  • 您不需要Iterator来遍历集合。正常的for-each循环将执行或将其转换为流
  • 如果您只想计算匹配数,那么流就可以了

把所有这些放在一起:

Path path = Paths.get("passwordInput.txt");
Set<User> users = new TreeSet<>();

long matches = Paths.lines(path)
    .mapToLong(l -> users.stream()
        .map(User::getName).filter(l::equals).count())
    .sum();