对于此分配,我需要将每个包含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>();
答案 0 :(得分:0)
你确定那是一个无限循环吗?您正在打开文件4000次,并为文件中的每一行迭代一个集合。根据文件的大小和集合,这可能需要很长时间。
其他一些需要注意的事项:
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();