搜索列表会导致错误的结果

时间:2015-10-18 23:09:25

标签: java

我有一个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语句,我无法尝试第二个。任何有关这方面的帮助将不胜感激。

1 个答案:

答案 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}}

可能更合适