Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无数据库的Java对象查询_Java_Algorithm_Data Structures - Fatal编程技术网

无数据库的Java对象查询

无数据库的Java对象查询,java,algorithm,data-structures,Java,Algorithm,Data Structures,注:小长问题。我会悬赏给你最好的答案 我要做的是查询对象。详情如下。我有一个名为employee.txt的文件。所以我分析了它并将其保存在列表中 public static List<Employee> employeeList = new LinkedList<>(); 我的密码 String valueToCompare = split[5]; //10 EmployeeCriteria criteria = new EmployeeCriteria(

注:小长问题。我会悬赏给你最好的答案

我要做的是查询对象。详情如下。我有一个名为employee.txt的文件。所以我分析了它并将其保存在列表中

public static List<Employee> employeeList = new LinkedList<>();
我的密码

String valueToCompare = split[5];  //10
EmployeeCriteria criteria = new EmployeeCriteria(
        isId, isName, isSalary, expression,
        valueToCompare);
result = EmployeeData.findAll(
        EmployeeData.employeeList, criteria);
这是findAll方法

public static List<Employee> findAll(List<Employee> coll,
            ISearch<Employee> chk) {
        List<Employee> l = new LinkedList<Employee>();
        for (Employee obj : coll) {
            if (chk.search(new Employee(obj)))
                l.add(obj);
        }
        return l;
    }
谢谢你的帮助。2天后将提供赏金。我现在不能那样做


注2:这是一项检查我的数据管理技能的测试,我不能使用任何数据库。

不,这一点都不好。您每次搜索N名员工。因此,如果您有100万名员工,您将搜索所有100万名员工,然后返回正确的员工。甚至最糟糕的是,如果它不存在,你必须在知道它是否存在之前进行彻底的搜索

这是用于生产的吗?如果是这样,那么就使用SQLite或其他一些简单的数据库。您希望使用索引进行一次写入和多次读取。我再怎么强调也不为过,你写的东西会有bug,你应该使用已经测试过的东西

假设这不是为了生产,您只是在享受乐趣,那么您希望模拟数据库在现实生活中的作用。它们创建索引。索引通常最好用Map来描述

其想法是,最初从磁盘读取数据是昂贵的。但你读过一次。对于每个维度、名称、薪资、ID等。。。您需要创建单独的索引

假设您正在按ID创建所有员工的索引。您可能希望执行以下操作:

Map<String, Employee> employeesById = new HashMap<>();

for(Employee e : employees) { 
  employeesById.put(e.getId(), e);
}
以上假设员工ID是唯一的。如果它们不是,那么您需要创建一个列表。例如,对于按名称索引:

Map<String,List<Employee>> employeesByName = new HashMap<>();

for(Employee e : employees) { 
  employeesByName.get(e.getName()).add(e); // Make sure to create the array if it doesn't exist
}
现在,对于阅读,假设你从员工那里得到SELECT*,其中id=123;您只需返回employeesById.get123即可


这个解决方案是O1。随着文件变大,您不会有任何性能损失。这可能是最快的解决方案

要添加到阿米尔的答案中,还可以使用树形图而不是哈希图。数据库通常不会将索引创建为哈希映射,而是创建为平衡的二叉树,这就是Java的TreeMap类

HashMap在键上有O1查找,但仅在键上完全匹配。TreeMap在键上有Olog n查找,但在键范围子映射上允许范围查找higherKey、lowerKey和映射分区


重复的问题可以通过不允许其为唯一键或将值存储在列表中并在子集非唯一键上进行线性搜索来解决。

假设您对其中任何一项不感兴趣,并使用Java 8, 您应该将所有条件转换为谓词,并在流上应用它们。这将利用Java8的并行特性

因此,简而言之,您的代码可以更干净、更快

 public static Predicate<Employee> isSalaryGreaterThan(Integer salary) {
        return p -> p.getSalary() > salary;
    }

Predicate predicate1 =   isSalaryGreaterThan(50000)
    employeeList.stream().filter(predicate1).filter(predicate2)...collect(Collectors.<Employee>toList())

我认为这可能更适合,但这是我的2美分:您应该将表达式解析为实现接口的类,例如,具有2个类字段和常量的值接口,以及具有类Equal、NotEqual、LessThan等的运算符接口。。。添加对And、Or、Plus和更多的支持将在您以后的生活中变得更容易。如果您希望将所有数据保留在内存中,LinkedList最适合,因为与ArrayList相比,它提供了简单的删除操作。这个解决方案可能会受到记录数的挑战,为了更好地使用内存,请加载元数据信息和员工的关键字段,如indexID、Name、Salary,而不是整个对象。@subbrajyotimajumder看到了JoSQL的源代码,并使用了反射。而且我只限于不使用第三方工具。@SubhrajyotiMajumder,如果我使用Id+Name组合作为键,当用户要求选择*where Name=suresh时,我需要迭代所有键集。这就是我现在停下来的地方。我没有详细介绍!=为了您只需找到全部,然后再次删除map.getRamesh,这意味着N次迭代,对吗?不,您可以执行新的HashMapByName.RemoveAmesh。它不是N个操作,而是M个操作,其中M是唯一名称的大小。然后出现了重复的问题:没有重复的问题吗?它很好用。您只需要使用正确的数据结构。这将比你今天的表现好得多。我不想了解树状图的细节,但你解释得很好。老实说,他必须有许多不同的数据结构来满足不同的需求。
Map<String, Employee> employeesById = new HashMap<>();

for(Employee e : employees) { 
  employeesById.put(e.getId(), e);
}
Map<String,List<Employee>> employeesByName = new HashMap<>();

for(Employee e : employees) { 
  employeesByName.get(e.getName()).add(e); // Make sure to create the array if it doesn't exist
}
 public static Predicate<Employee> isSalaryGreaterThan(Integer salary) {
        return p -> p.getSalary() > salary;
    }

Predicate predicate1 =   isSalaryGreaterThan(50000)
    employeeList.stream().filter(predicate1).filter(predicate2)...collect(Collectors.<Employee>toList())