我有一个Store类型列表,用户可以在列表中添加项目,这些项目有一个名称和一个与之关联的ID。
public class StoreSearch {
public static void main(String[] args) throws IOException {
ArrayList <Store> stores = new ArrayList();
String input = "";
String name;
int id = 0;
int newId = 0;
int index = 0;
BufferedReader in = new BufferedReader( new InputStreamReader(System.in));
while(!(input.equals("quit"))) {
System.out.println("Hello!\nEnter add or search");
input = in.readLine();
if(input.equalsIgnoreCase("add")) {
System.out.println("Enter a name ");
name = in.readLine();
System.out.println("Enter a id");
input = in.readLine();
id = Integer.parseInt(input);
Store s = new Store(name,id);
if(!stores.contains(s))
stores.add(s);//only add if combination of name and id are not in it
}
if(input.equals("search")) {
System.out.println("Enter a name");
name = in.readLine();
System.out.println("Enter a id guideline");
input = in.readLine();
index = input.indexOf("-");
if(index == 0) {
String substring = input.substring(input.lastIndexOf("-") + 1);
newId = Integer.parseInt(substring);
Store s = new Store(name,id);
for(int counter = 0; counter < stores.size(); counter++) {
if(stores.contains(s)) {
System.out.println(stores.toString());
}
}
}
if(index == 4) {
String[] parts = input.split("\\-"); // String array, each element is text between dots
newId = Integer.parseInt(parts[0]);
//the hyphen after the 4 digit number
}
else {
//only id
}
}
}
}
}
商店类:
public class Store {
private String name;
private int id;
public Store(String name, int id) {
this.name = name;
this.id = id;
}
@Override
public String toString() {
return " Name " + name + " id " + id;
}
@Override
public boolean equals(Object obj) {
if(obj instanceof Store){
Store element = (Store) obj;
if(this.name.equals(element.name) && element.id == (this.id)){
return true;
}
}
return false;
}
@Override
public int hashCode() {
int hash = 7;
hash = 61 * hash + Objects.hashCode(this.name);
hash = 61 * hash + this.id;
return hash;
}
}
添加到列表中没有任何问题,如果输入的内容的组合,我只会添加到列表,它的名称和ID已经不存在。但是,我试图搜索列表,这导致了我的问题。
例如,如果我已将这些元素添加到列表中:
Snack 3366
Apple 3367
Apple 3368
我想像这样搜索列表:
名字是&#34; Apple&#34;
Id准则是这个"-3368"
的含义,任何具有相同名称且ID为3368及之前的对象都应打印出来。但是,我的输出永远不会这样做。我尝试使用stores.get(index);
打印出来,但这仍然给我错误的输出。
对于第二个if语句,它检查它们是否是4位数字后面的连字符,在这种情况下类似于&#34; 3370 - &#34;将表示输入名称的所有对象,并且应返回id 3370及更高版本。请记住,我无法弄清楚第一个if语句,我无法尝试第二个。任何有关这方面的帮助将不胜感激。
答案 0 :(得分:1)
所以,这......
if(index >= 0) {
没有意义,因为它假设System.out.println("Enter a id guideline");
input = in.readLine();
input = in.readLine();
index = input.indexOf("-");
是第一个字符,我认为你打算使用System.out.println("Enter a name");
name = in.readLine();
System.out.println("Enter a id guideline");
input = in.readLine();
index = input.indexOf("-");
try {
String currentIDValue = input;
String replaceIDValue = null;
id = 0;
if (index >= 0) {
currentIDValue = input.substring(0, input.lastIndexOf("-"));
replaceIDValue = input.substring(input.lastIndexOf("-") + 1);
id = Integer.parseInt(currentIDValue);
} else {
id = Integer.parseInt(currentIDValue);
}
Store s = new Store(name, id);
if (stores.contains(s)) {
index = stores.indexOf(s);
s = stores.get(index);
System.out.println("You have selected " + s);
if (replaceIDValue != null) {
newId = Integer.parseInt(replaceIDValue);
// update the ID
}
} else {
System.out.println("Item does not exist");
}
} catch (NumberFormatException exp) {
exp.printStackTrace();
}
另外,
-
双读也似乎很奇怪
收费后,我觉得你想要的更像......
for(int counter = 0; counter < stores.size(); counter++) {
if(stores.contains(s)) {
System.out.println(stores.toString());
}
}
现在,这会读取用户的输入,它会检查List
并采取相应的操作,现在我已经包含了执行搜索以及搜索和更新的功能
当我在列表中添加了至少两个对象时,似乎无论我输入什么名称,当我搜索时,我总是得到两个对象输出两次(2行)。如果列表中有橙色2222,列表中有橙色2223,并且使用“-2222”搜索名称Orange,我会在两个不同的行上获得第一个结果,并且第二个元素也会显示,即使我在询问数字2222及以下。
那是因为你的原始代码完全按照你的要求做了......
List
对于s
中的每个项目,请将其打印出来,但仅当s
包含List#contains
时,假设List#indexOf
与您的任何一个项目相匹配列表,它将打印所有项目。
不需要循环,您只需使用 if (input.equals("search")) {
System.out.println("Enter a name");
name = in.readLine();
System.out.println("Enter a id guideline");
input = in.readLine();
String parts[] = input.split("-");
int lower = 0;
int upper = 0;
if (parts.length >= 1 && parts.length <= 2) {
if (parts.length == 2) {
if (parts[0] != null && parts[0].trim().length() > 0) {
// x-x
lower = Integer.parseInt(parts[0]);
upper = Integer.parseInt(parts[1]);
} else {
// -x
lower = Integer.MIN_VALUE;
upper = Integer.parseInt(parts[1]);
}
} else if (parts.length == 1) {
// x-
lower = Integer.parseInt(parts[0]);
upper = Integer.MAX_VALUE;
}
for (Store store : stores) {
if (store.id >= lower && store.id <= upper && store.name.equals(name)) {
System.out.println(store);
}
}
} else {
System.out.println("Invalid input");
}
}
}
和if money < cost
enable button
else disable button
when pressed, money + cost
output master money
的组合
“ - 2222”是2222是新的id,连字符是以前所有具有相同名称的id。 “2222-”2222再次成为新的id,hypen是更大的id(大于2222同名)。
好的,所以我们不仅要搜索单个项目,还要搜索符合指定条件的一系列项目,这样就像......
{{1}}
可能更合适