查询没有数据库的Java对象

前端之家收集整理的这篇文章主要介绍了查询没有数据库的Java对象前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
注意:很长的问题.我将给予赏金以获得最佳答案.

我想要做的是查询对象.这里是细节.我有一个名为employee.txt的文件.所以我解析了并保存在列表中

public static List<Employee> employeeList = new LinkedList<>();

那么这里是我查询的逻辑.

用户查询,然后解析.以下是通过列表进行查询的逻辑.

例如:这里是查询

select * from Employee where id > 10

我的代码

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;
    }

这里是我的搜索方式

/**
     * 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;
    }

让我知道,如果你想看到任何其他代码.

我只是想知道,

首先LinkedList是否正确使用数据结构?这是否表现良好?任何改进表现都不错?

任何更好的方式来实现这一点?

这里有几个示例查询

select * where ID > 100
select * where Name != Ramesh
select * where Salary < 500000
select Name order by Name
select ID

感谢任何帮助.奖金将在2天后提供.我现在不能这样做.

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

解决方法

不,这根本不行.您每次都在搜寻N名员工.所以如果你有100万员工,那么在返回正确的员工之前,您将搜索所有100万名员工.最糟糕的是,如果不存在,您将不得不仔细搜索,然后才能知道它是否存在.

这是否用于生产?如果是这样,那么只需使用sqlite或其他一些简单的数据库.您想要一次写入,并用索引读取多次.我不能强调你正在写的内容会有错误,而应该使用已经测试过的东西.

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

这个想法是,最初从磁盘读取数据是昂贵的.但你读了一次.对于每个维度,名称,工资,身份证等,您要创建单独的索引.

所以我们假设你是按ID创建一个所有员工的索引.你想做一些像:

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

for(Employee e : employees) { 
  employeesById.put(e.getId(),e);
}

以上假设员工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
}

所以现在,对于阅读,让我们说你得到SELECT * FROM的员工,其中id = 123;你可以简单地返回employeesById.get(“123”).

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

猜你在找的MsSQL相关文章