注意:很长的问题.我将给予赏金以获得最佳答案.
我想要做的是查询对象.这里是细节.我有一个名为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”).