【问题标题】:Age filter in Java with ArrayListJava 中使用 ArrayList 的年龄过滤器
【发布时间】:2021-08-13 05:42:26
【问题描述】:

我想创建一个方法,告诉我谁是 ArrayList 中最年长的人,谁是最年轻的人。该方法将接收我要应用该方法的arraylist,我的代码中有3个,每个都是一个联系人列表。

该方法假设返回人的姓名,但我不知道该怎么做。 Familia, Profissional 和 Amigos 是我的数组列表,“idade” = 年龄和“nome” = 姓名。

package com.company;

public class Contato {

    public String nome;
    public int idade;
    public String sexo;
    public String profissao;
    public String telefone;
    public String email;

    public Contato(String nome, int idade, String sexo, String profissao, String telefone, String email) {
        this.nome = nome;
        this.idade = idade;
        this.sexo = sexo;
        this.profissao = profissao;
        this.telefone = telefone;
        this.email = email;
    }

    @Override
    public String toString() {
        return "" +
                nome + ',' +
                idade + " anos de idade, " +
                "do sexo " + sexo + ',' +
                profissao + ',' +
                " telefone nº " + telefone + ", " +
                "e-mail:" + email;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public int getIdade() {
        return idade;
    }

    public void setIdade(int idade) {
        this.idade = idade;
    }

    public String getSexo() {
        return sexo;
    }

    public void setSexo(String sexo) {
        this.sexo = sexo;
    }

    public String getProfissao() {
        return profissao;
    }

    public void setProfissao(String profissao) {
        this.profissao = profissao;
    }

    public String getTelefone() {
        return telefone;
    }

    public void setTelefone(String telefone) {
        this.telefone = telefone;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}

package com.company;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;

public class GestaoContatos extends Contato {

    ArrayList<Contato> Familia = new ArrayList();
    ArrayList<Contato> Amigos = new ArrayList();
    ArrayList<Contato> Profissional = new ArrayList();

    public GestaoContatos(Contato c) {
        super(c.nome, c.idade, c.sexo, c.profissao, c.telefone, c.email);
    }

    public void adicionaContato(String nomeAgenda, Contato contato) {
        if( nomeAgenda == "Familia"){
            Familia.add(contato);
        } else
            if(nomeAgenda == "Amigos"){
                Amigos.add(contato);
            } else
                if(nomeAgenda == "Profissional") {
                    Profissional.add(contato);
                } else
                    System.out.println("Indispnível");
    }

    public void eliminaContato(String nomeContato) {
        for(int i = 0; i < Familia.size(); i++) {
            if(getFamilia().contains(nomeContato)) {
                Familia.remove(nomeContato);
            }
        }
    }

    public void printaLista(String nomeAgenda){
        if(nomeAgenda.equals("Familia")) {
            Familia.forEach(System.out::println);
        }
        if(nomeAgenda.equals("Amigos")) {
            Amigos.forEach(System.out::println);
        }
        if(nomeAgenda.equals("Profissional")) {
            Profissional.forEach(System.out::println);
        }
        else {
            throw new RuntimeException("Opcao invalida");
        }
    }

    public void tooString() {
        var contatos = new ArrayList<Contato>();
        Familia.forEach(it -> contatos.add(it));
        Amigos.forEach(it -> contatos.add(it));
        Profissional.forEach(it -> contatos.add(it));

        System.out.println(contatos.toString());
    }

    public void olderPerson(String nomeAgenda){
        int i = 0;
        if (nomeAgenda.equals("Amigos")) {
            for (i = 0; Familia.size(); i++) {
                Familia.stream().filter();
            }

        }
    }

    public void geraListaBinaria() throws IOException {
        var file = new File("C:\\Users\\Jorge Luiz\\Desktop\\contatos.txt");
        var writer = new FileWriter(file.getName());
        writer.write(this.getProfissional().toString());
        writer.write(this.getFamilia().toString());
        writer.write(this.getProfissional().toString());
        writer.close();
    }

    public ArrayList<Contato> getFamilia() {
        return Familia;
    }

    public void setFamilia(ArrayList<Contato> familia) {
        Familia = familia;
    }

    public ArrayList<Contato> getAmigos() {
        return Amigos;
    }

    public void setAmigos(ArrayList<Contato> amigos) {
        Amigos = amigos;
    }

    public ArrayList<Contato> getProfissional() {
        return Profissional;
    }

    public void setProfissional(ArrayList<Contato> profissional) {
        Profissional = profissional;
    }
}

【问题讨论】:

  • 好吧,为了得到一个最小值(或最大值),最简单的解决方案是为初始当前最小值选择一个不可能高的值,迭代列表,每次找到一个值小于当前最小值,更新当前最小值。用尽所有值后,“当前最小值”将是所有值中的最小值。找到一个最大值是一样的,但是你会从一个不可能的低值开始,所以第一个“真实”值肯定会高于这个值。如何实现?
  • 我如何得到它?我正在尝试使用 forEach,对吗? public void olderPerson(String nomeAgenda){ int i = 99999; if (nomeAgenda.equals("Amigos")) { Familia.forEach(contato -&gt; { int c = contato.getIdade(); if(c &lt; i) { System.out.println(); } }); } }
  • getIdade() 是从 Contato 或 Contact 获取年龄的方法。
  • 我使用流提供了答案,但我现在看到您使用 for-loop 标记了您的问题。如果您想要直播答案,请告诉我,我会恢复我的答案。
  • 旁注:不会将String 对象与== 进行比较。所以if (nomeAgenga == "Amigos") 是行不通的。使用if ("Amigos".equals(nomeAgenda) 以便使用.equals 方法。示例代码混合了==.equals()

标签: java for-loop arraylist java-stream


【解决方案1】:

如果你想在一个列表中返回最年长的人:

public Contato oldestPerson(String nomeAgenda){
    return Familia.stream()
            .filter(c -> c.getNome().equals(nomeAgenda)) // contatos named nomeAgenda
            .max(Comparator.comparingInt(Contato::getIdade)) // take oldest
            .get();
}

对于您可以执行的所有列表:

public Contato oldestPerson(){
    return Stream.of(Familia,  Amigos, Profissional)
            .flatMap(Collection::stream) // flatting to one long stream
            .filter(c -> c.getNome().equals(nomeAgenda)) // contatos named nomeAgenda
            .max(Comparator.comparingInt(Contato::getIdade))
            .get();
}

编辑

根据评论,我们应该改变一些事情来实现你想要的。首先,我们应该定义一个Map&lt;String, List&lt;Contato&gt;&gt; 并在构造函数中填充它:

private Map<String, List<Contato>> contatoGroups;
private static final String familiaKey = "Familia";
private static final String amogisKey = "Amigos";
private static final String profissionalKey = "Profissional";

public GestaoContatos(Contato c) {
    super(c.nome, c.idade, c.sexo, c.profissao, c.telefone, c.email);

    contatoGroups.put(familiaKey, new ArrayList<>());
    contatoGroups.put(amogisKey, new ArrayList<>());
    contatoGroups.put(profissionalKey, new ArrayList<>());
}

(考虑使用enum 而不是String 作为映射中的键)

那么无论你想得到一个组,例如:Familia,你应该这样做:

List<Contato> contatoes = contatoGroups.get(familiaKey);

然后我们应该像这样更改oldestPerson()

public Contato oldestPerson(String nomeAgenda){ // nomeAgenda could be "Familia", "Amigos"...
    List<Contato> selectedGroup = contatoGroups.get(nomeAgenda); 

    return selectedGroup.stream()
            .max(Comparator.comparingInt(Contato::getIdade)) // take oldest
            .get();
}

【讨论】:

  • 谢谢你!但是这个方法接收什么参数呢?上下文中的 nomeAgenda 表示该方法将搜索最年长的人的数组列表(Amigos、Familia 或 Profissional)的名称。
  • @Ozzott 我现在根据您的评论编辑了我的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-22
  • 1970-01-01
  • 2021-12-07
相关资源
最近更新 更多