0
votes

ArrayLists et retour de null

J'essaye de terminer ma méthode "priorité" qui devrait renvoyer la priorité de la Tâche . et faites-le retourner null si le nom spécifié n'existe pas (comme indiqué dans le main). J'ai essayé d'itérer dans ArrayList , mais je ne pense pas que ce soit la façon de le faire. Quelqu'un peut-il m'aider?

class Task
{
    public static final ArrayList<Task> ALL_TASKS = new ArrayList<>();

    private String name;
    private Integer priority;

    public Task(String name, Integer priority)
    {
        this.name = name;
        this.priority = priority;
        ALL_TASKS.add(this);
    }

    @Override public String toString()
    {
        return "name: " + this.name + "\tpriority: " + this.priority;
    }
}

class Main
{
    public static void main(String[] arguments)
    {
        new Task("Clean", 5);
        new Task("Dishwash", 4);
        new Task("Study", 1);
        System.out.println(Task.priority("Dishwash"));
        System.out.println(Task.priority("Vacuumclean"));
    }
}


3 commentaires

Pourquoi avez-vous supprimé une partie du code essentielle pour comprendre le main ?


Dupliqué? Voir Stackoverflow.com/questions/17526608/...


Vous ne devriez pas retourner NULL ici, facultatif serait meilleur choix


4 Réponses :


1
votes

Essayez ceci:

public static Integer priority(String name) {
    return ALL_TASKS.stream()
            .filter(task -> task.name.equals(name))
            .map(task -> task.priority)
            .findFirst()
            .orElse(null);
}

Ou utilisez Stream-API:

public static Integer priority(String name) {
    for(Task task : ALL_TASKS) {
        if(task.name.equals(name)) {
            return task.priority;
        }
    }
    return null;
}


2 commentaires

cela ne fonctionnera pas, car le nom de la tâche est privé


@noname la méthode est membre de la classe Task , donc privé n'a pas d'importance.



0
votes
public static Integer priority(String name) {
        for(int i = 0; i < ALL_TASKS.size(); i++){
          if(ALL_TASKS.get(i).getName().equals(name))
            return ALL_TASKS.get(i).getPriority();
          else
            return null; // but if using Java 8 Option<Task> would be better
        }
    }
This is the example which I would use. It is not tested but it give you idea what create and the way of thinking.Also in my solution I assume you also create getName() and getPriority() methods for your Task 

0 commentaires

0
votes

L'API Java Stream offre une approche plus pratique et plus efficace pour l'itération et le traitement des éléments d'une collection.

class Task
{
    public static final ArrayList<Task> ALL_TASKS = new ArrayList<>();

    public static Integer priority(String name)
    {
        List<Task> result = ALL_TASKS.stream().filter(task-> 
                          (task.name.equals(name))).collect(Collectors.toList());
        if(result.isEmpty())
        {
            return null;
        }
        else
        {
            return result.get(0).priority;
        }
    }

    private String name;
    private Integer priority;

    public Task(String name, Integer priority)
    {
        ALL_TASKS.add(this);
        this.name = name;
        this.priority = priority;
    }

    public String toString()
    {
        return "name: " + this.name + "\tpriority: " + this.priority;
    }
}

class Main
{
    public static void main(String[] arguments)
    {
        new Task("Clean", 5);
        new Task("Dishwash", 4);
        new Task("Study", 1);
        System.out.println(Task.priority("Dishwash"));
        System.out.println(Task.priority("Vacuumclean"));
    }

}


0 commentaires

0
votes

Une option stockerait votre Liste en tant que carte à la place, à l'aide des tâches nom comme clé xxx

Si une tâche est composée uniquement de nom et priorité , il est encore plus simple xxx


0 commentaires