java - 在具有多个参数的 ArrayList 中搜索

标签 java arraylist collections

昨天,我在技术回合中接到了以下要实现的任务。我不希望你执行所有任务,我自己尝试过,但我停留在问题 3 上。我的问题是如何实现按注册号搜索?因为根据问题5,它应该更有效率。我尝试使用 HashMap 但无法解决它。

  1. 按字母顺序维护狗的列表,首先按名称,然后按品种。
  2. 提供添加新狗的方法。
  3. 提供按注册号搜索的方法。
  4. 提供按名称搜索的方法。
  5. 采用最有效的搜索技术。
  6. 接受初始狗列表的构造函数。
  7. 可以通过什么简单的构造来改进 Dog 类

DogSort.java

public class DogSort {

    public static void main(String[] args) {
        ArrayList<Dog> listDog = new ArrayList<Dog>();

        Scanner sc = new Scanner(System.in);

        listDog.add(new Dog("Max", "German Shepherd", "33"));
        listDog.add(new Dog("Gracie","Rottweiler","11"));
        listDog.add(new Dog("Sam", "Beagle", "22"));
        System.out.println(listDog);

        System.out.println("Select one of the following commands: ");
        System.out.println(
                "Press 1: Sort by name\n"+
                "Press 2: Sort by breed\n" +
                "Press 3: Add new dog\n" +
                "Press 4: Search by registration number\n" +
                "Press 5: Serach by Name\n ");

        int i = sc.nextInt();
        switch (i){
            case 1: Collections.sort(listDog, Dog.COMPARE_BY_NAME);
                System.out.println(listDog);
                break;
            case 2:
                Collections.sort(listDog, Dog.COMPARE_BY_BREED);
                System.out.println(listDog);
                break;
            default:
                System.out.println("Invalid input");
                break;       
        }

    } 
}

Dog.java

class Dog {
    private String name;
    private String breed;
    private String registrationNumber;


    public Dog(String name, String breed, String registrationNumber) {
        this.name = name;
        this.breed = breed;
        this.registrationNumber = registrationNumber;
    }

    public String getName() {
        return this.name;
    }

    public String getBreed() {
        return this.breed;
    }

    public String getRegistrationNumber() {
        return this.registrationNumber;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setBreed(String breed) {
        this.breed = breed;
    }

    public void setRegistrationNumber(String registrationNumber) {
        this.registrationNumber = registrationNumber;
    }

    @Override
    public String toString() {
        return this.name;
    }


    public static Comparator<Dog> COMPARE_BY_NAME = new Comparator<Dog>() {
        public int compare(Dog one, Dog other) {
            return one.name.compareTo(other.name);
        }
    };

    public static Comparator<Dog> COMPARE_BY_BREED = new Comparator<Dog>() {
        public int compare(Dog one, Dog other) {
            return one.breed.compareTo(other.breed);
        }
    };
}

最佳答案

有多种方法可以解决这个问题。

第一个解决方案是使用 Java 8 Stream API。您将能够搜索、过滤结果并返回过滤后的结果。如果您没有太复杂的逻辑并且没有太多的条目,那么这是一个很好的方法。如果您有更多条目,我会寻求其他解决方案。

第二个解决方案是使用多个 map 以及您想要搜索的特定键。搜索名称时,实现可能会变得更加复杂(可能有不止一只狗具有相同的名称)。根据您要查找的内容,您可以在本例中使用给定的 map 。

第三种解决方案(可能有点过大)...如果您要将其扩展一段时间,您可以寻找一个真正的搜索引擎。 Elasticsearch 也作为嵌入式搜索引擎存在。但正如我所说,这可能有点过大,只有当您有大量数据和不同字段需要搜索和组合时才有意义。

我也对其他解决方案感兴趣...

关于java - 在具有多个参数的 ArrayList 中搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45942419/

相关文章:

java - 使用ServiceLoader实现JRE服务,但不带模块

java - 如何从 map 列表中删除特定对象?

java - 显示 JCombobox 项目的完整字符串,其中组合框的宽度小于字符串

java - 过滤器将 ArrayList<object> 添加到 HashMap

java - 根据教师 ID 对学生列表进行排序

java.lang.IllegalStateException : LifecycleProcessor not initialized . ...上下文 - 在我的聊天应用程序上

java - 从 HashMap 获取值并填充 Java 对象

java - 确定二进制数的间隙长度

java - 何时返回空集合,何时不返回?

java - 实例化类型 <?> 的泛型类