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:这是检查我的数据管理技能的测试,我不能使用任何数据库.
不,这根本表现不好。N你每次都在寻找员工。因此,如果您有 100 万员工,您将搜索所有100 万员工,然后返回正确的员工。更糟糕的是,如果它不存在,您将不得不进行详尽的搜索才能知道它是否存在。
这是用于生产吗?如果是这样,那么只需使用 SQLite 或其他一些简单的数据库。您希望使用索引写入一次并读取多次。我无论如何强调你所写的内容都会有错误,相反你应该使用已经测试过的东西。
假设这不是为了生产而您只是为了好玩,那么您想要模拟数据库在现实生活中的作用。他们创建索引。索引通常最好描述为Map<String, List<Employee>>。
这个想法是,最初从磁盘读取数据的成本很高。但你读过一次。对于每个维度,Name、Salary、ID等...您想要创建单独的索引。
假设您要按 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). 随着文件变大,您不会有任何性能损失。这可能是最快的解决方案。
| 归档时间: |
|
| 查看次数: |
598 次 |
| 最近记录: |