在没有数据库的情况下查询Java对象

Sur*_*tta 14 java algorithm data-structures

注意:问题很少.我将给予最佳答案赏金.

我正在尝试做的是查询对象.这是细节.我有一个名为的文件employee.txt.所以我解析了它并保留在列表中

public static List<Employee> employeeList = new LinkedList<>();
Run Code Online (Sandbox Code Playgroud)

然后这是我的查询逻辑.

从用户获取查询,然后解析它.以下是通过列表查询的逻辑.

例如:这是查询

select * from Employee where id > 10
Run Code Online (Sandbox Code Playgroud)

我的代码

String valueToCompare = split[5];  //10
EmployeeCriteria criteria = new EmployeeCriteria(
        isId, isName, isSalary, expression,
        valueToCompare);
result = EmployeeData.findAll(
        EmployeeData.employeeList, criteria);
Run Code Online (Sandbox Code Playgroud)

这是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;
    }
Run Code Online (Sandbox Code Playgroud)

这是我的搜索方法

/**
     * Based on the type provided and for given expression it check against the
     * given value
     */

    @Override
    public boolean search(Employee obj) {
        if (expression.equals(EQUAL)) {
            if (isId()) {
                if (obj.getId() == Long.parseLong(valueToCompare)) {
                    return true;
                }
            } else if (isName()) {
                if (obj.getName().equals(valueToCompare)) {
                    return true;
                }
            } else if (isSalary()) {
                if (obj.getSalary() == Long.parseLong(valueToCompare)) {
                    return true;
                }
            } else {
                System.err.println(UserMessage.INVALIDCOLUMN_NAME);
            }

        } else if (expression.equals(NOT_EQUAL)) {
            if (isId()) {
                if (!(obj.getId() == Long.parseLong(valueToCompare))) {
                    return true;
                }
            } else if (isName()) {
                if (!(obj.getName().equals(valueToCompare))) {
                    return true;
                }
            } else if (isSalary()) {
                if (!(obj.getSalary() == Long.parseLong(valueToCompare))) {
                    return true;
                }
            } else {
                System.err.println(UserMessage.INVALIDCOLUMN_NAME);
            }

        } else if (expression.equals(GREATER)) {
            if (isId()) {
                if ((obj.getId() > Long.parseLong(valueToCompare))) {
                    return true;
                }
            } else if (isSalary()) {
                if ((obj.getSalary() > Long.parseLong(valueToCompare))) {
                    return true;
                }
            } else {
                System.err.println(UserMessage.INVALIDCOLUMN_NAME);
            }

        } else if (expression.equals(LESSER)) {
            if (isId()) {
                if ((obj.getId() < Long.parseLong(valueToCompare))) {
                    return true;
                }
            } else if (isSalary()) {
                if ((obj.getSalary() < Long.parseLong(valueToCompare))) {
                    return true;
                }
            } else {
                System.err.println(UserMessage.INVALID_IDENTIFIER);
            }

        }

        return false;
    }
Run Code Online (Sandbox Code Playgroud)

如果您想查看任何其他代码,请告诉我们.

我只是想知道,

首先LinkedList是正确的数据结构使用?这表现得好吗?任何增强功能都表现良好?

有没有更好的方法实现这一目标

这里有一些示例查询:

select * where ID > 100
select * where Name != Ramesh
select * where Salary < 500000
select Name order by Name
select ID
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助.Bounty将在2天后提供.我现在不能这样做.

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

Ami*_*far 4

不,这根本表现不好。N你每次都在寻找员工。因此,如果您有 100 万员工,您将搜索所有100 万员工,然后返回正确的员工。更糟糕的是,如果它不存在,您将不得不进行详尽的搜索才能知道它是否存在。

这是用于生产吗?如果是这样,那么只需使用 SQLite 或其他一些简单的数据库。您希望使用索引写入一次并读取多次。我无论如何强调你所写的内容都会有错误,相反你应该使用已经测试过的东西。

假设这不是为了生产而您只是为了好玩,那么您想要模拟数据库在现实生活中的作用。他们创建索引。索引通常最好描述为Map<String, List<Employee>>

这个想法是,最初从磁盘读取数据的成本很高。但你读过一次。对于每个维度,NameSalaryID等...您想要创建单独的索引。

假设您要按 ID 创建所有员工的索引。你会想做类似的事情:

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

for(Employee e : employees) { 
  employeesById.put(e.getId(), e);
}
Run Code Online (Sandbox Code Playgroud)

上面假设员工 ID 是唯一的。如果不是,那么您需要创建一个List<Employee>. 例如按名称索引:

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
}
Run Code Online (Sandbox Code Playgroud)

现在,对于阅读,假设您SELECT * FROM employees where id = 123;可以简单地 return employeesById.get("123")

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