2013-11-10 4 views
0

Я использую blueJ, чтобы написать это. То, что я пытаюсь сделать, это написать метод, называемый removeUser() в классе userGroup, который принимает String как параметр, который является именем пользователя, которое я хочу удалить. Используя Iterator, перебирайте список до тех пор, пока я не найду пользователя с этим именем пользователя и не удалю его. Мой код:Удаление пользователя из arraylist по имени пользователя

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){ 
     people.remove(username); 
    } 

} 

Это все компилируется нормально, но когда я запускаю метод RemoveUser это не похоже, чтобы удалить что-либо из массива!

+1

Ответ на вопрос: * Используя Iterator, перебирайте список, пока я не найду пользователя с этим именем пользователя и не удаляю их * , Это не то, что делает код. Он пытается удалить строку из списка пользователей. Делайте то, о чем говорит этот вопрос. И используйте согласованные имена для ваших переменных: id или username, но не оба. actualName или имя, но не оба. Это делает вещи чрезвычайно запутанными. –

ответ

4
public void removeUser(String username) { 
    Iterator<User> itr = people.iterator(); 
    while (itr.hasNext()) { 
      Users element = (User) itr.next(); 
      if (element.getUsername().equals(username)) { 
       itr.remove(); // REMOVE THIS FROM Iterator 
      } 
    } 
} 
+0

Вы пробовали свое решение? –

+0

случайно вдавлено отправить ... редактирование. – ajc

+1

зачем сравнивать строку с оператором ==? – xwhyz

1

Попробуйте удалить пользователя вместо узла со строковым именем пользователя или если вы действительно хотите удалить пользователя по строкам, просто выполните повторение, пока не найдете пользователя с той же строкой User.actualName.equals (имя пользователя)

public void removeUser(String username) { 
    Iterator<User> it = people.iterator(); 
    while(it.hasNext()) { 
    if(it.next().getName().equals(username)) { it.remove(); break; } 
    } 
} 
0

Я рекомендую использовать карту, где ключ будет прозвищем. Затем удаление будет выглядеть

Map<String,User>myMap = new HashMap<String,User>(); 
myMap.put("username", new User(...)); 
myMap.remove("username") 

Такой подход дает более Performace, поскольку чтение Карта является более эффективным, чем итерация массива и он выглядит лучше в коде

1

Вы хотите создать функцию. Скажем, getUserByName(String name);

Как так:

public User getUserByName(String name){ 
    for(int i = 0 ; i < people.size(); i++){ 
     if(people.get(i).actualName.equals(name)){ 
      return people.get(i); 
     } 
    } 
} 

Затем вы можете удалить их просто выполнив:

people.remove(getUserByName("Alex"));

+2

Это будет повторяться дважды через список, а не только один раз. И это не то, что задают. –

+0

, но имеет смысл, когда вы используете getUserByName (String) как многократно используемую часть кода (когда вы ищете, чтобы соответствовать пользователю по заданным критериям) – ceph3us

0

Вот подсказка:

public void removeUser(String username){ 
    people.remove(username); 
} 

Здесь username - это строка. Вы пытаетесь удалить String из ArrayList, который содержит только «Пользователи», а не «Строки».

0
public int addProduct(Product item) 

{ 

    int id = 0; 

    stock.add(item); 

    numberOfProducts++; 

    for(int i = 0 ; i < stock.size(); i++) 
    { 

     if(stock.get(i).getID() == item.getID()) 
     { 

      id++; 

     } 

     if(id > 1) 

     { 

      stock.remove(i); 

      numberOfProducts--; 

     } 

    } 

    return id; 

} 

Это замечательно подходит для крепления изделий или предметов с одинаковым идентификатором! Если у вас есть какие-либо вопросы по поиску имен в var, то задание проекта «BlueJ» grade 12.

+0

Этот код, кажется, полностью не связан с кодом в вопросе. Как это должно быть ответом? – Kenster

Смежные вопросы