查询没有数据库的Java对象

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

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

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

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

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

例如:这里是查询

  1. select * from Employee where id > 10

我的代码

  1. String valueToCompare = split[5]; //10
  2. EmployeeCriteria criteria = new EmployeeCriteria(
  3. isId,isName,isSalary,expression,valueToCompare);
  4. result = EmployeeData.findAll(
  5. EmployeeData.employeeList,criteria);

这是findAll方法

  1. public static List<Employee> findAll(List<Employee> coll,ISearch<Employee> chk) {
  2. List<Employee> l = new LinkedList<Employee>();
  3. for (Employee obj : coll) {
  4. if (chk.search(new Employee(obj)))
  5. l.add(obj);
  6. }
  7. return l;
  8. }

这里是我的搜索方式

  1. /**
  2. * Based on the type provided and for given expression it check against the
  3. * given value
  4. */
  5.  
  6. @Override
  7. public boolean search(Employee obj) {
  8. if (expression.equals(EQUAL)) {
  9. if (isId()) {
  10. if (obj.getId() == Long.parseLong(valueToCompare)) {
  11. return true;
  12. }
  13. } else if (isName()) {
  14. if (obj.getName().equals(valueToCompare)) {
  15. return true;
  16. }
  17. } else if (isSalary()) {
  18. if (obj.getSalary() == Long.parseLong(valueToCompare)) {
  19. return true;
  20. }
  21. } else {
  22. System.err.println(UserMessage.INVALIDCOLUMN_NAME);
  23. }
  24.  
  25. } else if (expression.equals(NOT_EQUAL)) {
  26. if (isId()) {
  27. if (!(obj.getId() == Long.parseLong(valueToCompare))) {
  28. return true;
  29. }
  30. } else if (isName()) {
  31. if (!(obj.getName().equals(valueToCompare))) {
  32. return true;
  33. }
  34. } else if (isSalary()) {
  35. if (!(obj.getSalary() == Long.parseLong(valueToCompare))) {
  36. return true;
  37. }
  38. } else {
  39. System.err.println(UserMessage.INVALIDCOLUMN_NAME);
  40. }
  41.  
  42. } else if (expression.equals(GREATER)) {
  43. if (isId()) {
  44. if ((obj.getId() > Long.parseLong(valueToCompare))) {
  45. return true;
  46. }
  47. } else if (isSalary()) {
  48. if ((obj.getSalary() > Long.parseLong(valueToCompare))) {
  49. return true;
  50. }
  51. } else {
  52. System.err.println(UserMessage.INVALIDCOLUMN_NAME);
  53. }
  54.  
  55. } else if (expression.equals(LESSER)) {
  56. if (isId()) {
  57. if ((obj.getId() < Long.parseLong(valueToCompare))) {
  58. return true;
  59. }
  60. } else if (isSalary()) {
  61. if ((obj.getSalary() < Long.parseLong(valueToCompare))) {
  62. return true;
  63. }
  64. } else {
  65. System.err.println(UserMessage.INVALID_IDENTIFIER);
  66. }
  67.  
  68. }
  69.  
  70. return false;
  71. }

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

我只是想知道,

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

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

这里有几个示例查询

  1. select * where ID > 100
  2. select * where Name != Ramesh
  3. select * where Salary < 500000
  4. select Name order by Name
  5. select ID

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

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

解决方法

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

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

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

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

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

  1. Map<String,Employee> employeesById = new HashMap<>();
  2.  
  3. for(Employee e : employees) {
  4. employeesById.put(e.getId(),e);
  5. }

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

  1. Map<String,List<Employee>> employeesByName = new HashMap<>();
  2.  
  3. for(Employee e : employees) {
  4. employeesByName.get(e.getName()).add(e); // Make sure to create the array if it doesn't exist
  5. }

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

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

猜你在找的MsSQL相关文章