【问题标题】:writing a method which returns an iterator from arraylist [closed]编写一个从arraylist返回迭代器的方法[关闭]
【发布时间】:2013-11-22 08:59:17
【问题描述】:

我正在使用 blueJ 来编写这个。我想要做的是将一个名为getUserIterator() 的方法添加到UserGroup,即returns an Iterator 来自ArrayList,并使用我的方法返回的Iterator 循环遍历现有用户并添加其@987654326 的任何用户@ 是 "admin" 到管理员组。我不知道该怎么做!!我的代码如下:

用户类别:

package user; 
public class User{
    public enum UserType{                          
        ADMIN, EDITOR, USER;
    }

    private String id;                            
    private UserType userPermissions;              
    private String actualName;                     

    public User(String username, UserType userType, String name){
        id = username;
        userPermissions = userType;
        actualName= name;
    }

    public String getUsername(){
        return id;
    }

    public UserType getUserType(){
        return userPermissions;
    }       

    public String getName(){
        return actualName;
    }

    public void setUserType(UserType input){
        userPermissions = input;
    }
}

userGroup 类是:

package user;
import java.util.*;
import user.User.UserType; 

public class UserGroup{

    private ArrayList<User> people;

    public UserGroup(){
        people = new ArrayList<User>();
    }

    public void addSampleData(){
        people.add(new User("jar1g13", UserType.ADMIN,"Jonny"));
        people.add(new User("ao9", UserType.EDITOR,"Aniruddh"));
        people.add(new User("pe6", UserType.USER,"Peter"));
        people.add(new User("mat73", UserType.USER,"Matthew"));
        people.add(new User("ora69", UserType.EDITOR,"Oranthi"));
        people.add(new User("ben12", UserType.USER,"Benedict"));
        people.add(new User("cam30", UserType.ADMIN,"Cambyse"));
        people.add(new User("are20", UserType.USER,"Alex"));
        people.add(new User("lim19", UserType.USER,"Liam"));
        people.add(new User("ada13", UserType.EDITOR,"Adam"));
    } 

    public User getUser(int idx){
        return people.get(idx);
    }

    public void printUsernames(){
        for (User user: people){
            System.out.printf("%s %s\n", user.getUsername(), user.getUserType());
        }
    }

    public void removeFirstUser(){
        people.remove(0);
    }

    public void removeLastUser(){
        people.remove(people.size()-1);
    }

    public void removeUser(String username){
        Iterator<User> itr = people.iterator();
        while (itr.hasNext()){
            User element = (User) itr.next();
            if (element.getUsername().equals(username)){
                itr.remove();                                       
            }
        }
    }

}

主类:

package user;

public class Main{

    public static void main(String[] args){
        UserGroup grp = new UserGroup();          
        grp.addSampleData();                       
        grp.printUsernames();                      
    }

    public static void admins(){
        UserGroup administrators - new UserGroup(); 
    }
}

【问题讨论】:

  • 这段代码有什么问题?什么不工作,或者缺少什么?
  • 我在任何地方都看不到您的 getUserIterator() 方法。
  • 您已经针对 remove() 方法提出了一个问题,并且没有尝试自己编写代码。我们不会为你做所有的功课。尝试一些东西。阅读文档。如果您遇到困难,请发布您尝试过的内容并解释无效的内容。
  • 我建议您覆盖 equalshashCode 并在 List 上使用 remove() 方法,而不是自己滚动...

标签: java arraylist iterator


【解决方案1】:

我会这样写

public class UserGroup implements Iterable<User> {
    private final List<User> people = new ArrayList<User>();

    public Iterator<User> iterator() {
        return people.iterator();
    }
    // OR to prevent the list being modified.
    public Iterator<User> iterator() {
        return Collections.unmodifableList(people).iterator();
    }
    // OR for extra paranoia
    public Iterator<User> iterator() {
        return Collections.unmodifableList(new ArrayList<Person>(people)).iterator();
    }
    // OR for even more paranoia
    public Iterator<User> iterator() {
        List<People> ret = new ArrayList<People>();
        for(People p : people)
            ret.add(new Person(p)); // take a deep copy.
        return Collections.unmodifableList(ret).iterator();
    }
}

// later
UserGroup userGroup = ...
for(User u : userGroup) {
   // do something with u
}

这假设你不需要担心你的调用者修改列表(这是不应该做的,但有些人担心这样的事情)

【讨论】:

  • 看起来更好,用户组这个名字已经让它听起来像一个集合,所以实现界面更清晰,+1
  • 如果一个人偏执,总是可以在获得iterator 之前将people 包裹在unmodifiableList 中。
  • @BoristheSpider +1 即使您不需要这样做,列出一些选项以备不时之需。
【解决方案2】:

你需要一个

public Iterator<User> getIterator(){
  return people.iterator;
}

UserGroup 类中,您可以在任何其他类(或方法)中访问它,这些类(或方法)处理迭代列表中的用户并执行诸如检查他们的类型是否对应于给定类型(如您想要与管理员合作)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-26
    • 1970-01-01
    • 2014-11-17
    • 1970-01-01
    • 2015-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多