顺序搜索不能按预期工作

时间:2015-08-03 08:14:24

标签: java arraylist

我编写了一个程序,用一个按钮按下用户输入的单词,并将它们放入ArrayList中。还有另一个文本字段,用户可以在其中输入字母或单词,用户可以通过另一个按钮按下在ArrayList中搜索。我正在使用顺序搜索算法来完成此任务,但它不能像我期望的那样工作;如果找到搜索到的单词,则应返回搜索功能,并在textArea中打印出找到该单词的位置以及找到该单词的位置。这有效,但仅适用于第一次搜索。如果找不到该单词,则该函数应打印出未找到该单词。这是我想要的。

问题是,在我搜索了一个单词后,它显示了ArrayList中可以找到的位置,当我按下按钮后没有任何反应,无论输入的字母/单词是否在数组中。这就像文本存储的字符串没有变化。我不明白为什么......以下是搜索功能的自定义Class,然后是我的Main类:

public class Search {
    static private int i;
    static String index;
    static boolean found = false;

public static String sequencial (ArrayList<String> list, String user) {
    for (int i = 0; i < list.size(); i++) {
        if (list.get(i).equals(user)) {
            index = "The word " + user  + " exist on the place " + i + " in the Arraylist";
            found = true;
        }
    }
    if (!found) {
        index = "The word " + user + " could not be found";
    }
    return index;
}

我的Main课程:

ArrayList<String> list = new ArrayList<String>();
ArrayList<String> s = new ArrayList<String>();   

private void btnAddActionPerformed(java.awt.event.ActionEvent evt) {                                          
    // TODO add your handling code here:
    txtaOutput.setText("");
    String word = txtfAdd.getText();
    list.add(word);
    for (int i = 0; i < list.size(); i++) {
        txtaOutput.append("" + list.get(i) + "\n");
    }
}

private void btnSearchActionPerformed(java.awt.event.ActionEvent evt) {                                        
    // TODO add your handling code here:
    String user = txtfSearch.getText();
    txtaOutput.setText("");
    String index = Search.sequencial(list, user);
    txtaOutput.setText("" + index);
}

感谢任何帮助!

4 个答案:

答案 0 :(得分:5)

问题是您将found变量声明为static。当找到你的第一个单词时,它被设置为true,并且没有任何东西将它设置为假。而不是使它成为一个静态变量,在sequencial(它的拼写为顺序,顺便说一句)函数中将其声明为局部变量,就在for循环之前。

事实上,您声明为静态的所有变量都应该是本地的。声明静态变量从不是一个好主意。

答案 1 :(得分:1)

正如其他用户所说:

  • List#indexOf(Object)方法。您应该使用它而不是重新发明轮子(除非您需要,在这种情况下,您可能会看一下ArrayList实现)。还有其他收藏品,例如HashSet更适合查找,但我想这是另一个历史。
  • 变量(i,index,found)的范围和名称容易出错。其他方法甚至类需要访问这些变量吗?如果您需要保留这些变量,则可能需要选择可见性(公共,受保护,私有)。 &#34;指数&#34;是一个误导性的消息名称选择。

这将是您的代码的略微简化/更正版本:

// Ommit those unneeded static variables

public static String sequencial (ArrayList<String> list, String user) {
    int indexFound = list.indexOf(user);
    if (user >= 0) {
         return "The word " + user  + " exist on the place " + indexFound + " in the Arraylist";
    } else {
         return "The word " + user + " could not be found";
    }
}
...
private void btnSearchActionPerformed(java.awt.event.ActionEvent evt) {                                        
    String user = txtfSearch.getText();
    // txtaOutput.setText("");
    String seqMessage = sequencial(list, user);
    txtaOutput.setText(seqMessage);
}

答案 2 :(得分:0)

当您想使用常量时,我​​们使用静态属性。您不应在此处使用静态属性。当您找到的属性第一次更改时,会发生此问题,不会再次更改。从那时起,它将永远是真实的。与index属性类似。以下是您可以解决此问题的代码:

public class Search {

    public static SearchResult sequencial (ArrayList<String> list, String user) {
        SearchResult result = null;
        for (int i = 0; i < list.size(); i++) {
            if (list.get(i).equals(user)) {
                String index = "The word " + user  + " exist on the place " + i + " in the Arraylist";
                boolean found = true;
                result = new SearchResult(index, found);
                break;
            }
        }

        if (result == null) {
            String index = "The word " + user + " could not be found";
            result = new SearchResult(index);
        }
        return result;
    }

    //sample inner class
    static class SearchResult {
        private String index;
        private boolean found;

        public SearchResult(String index) {
            this.index = index;
        }

        public SearchResult(String index, boolean found) {
            this.index = index;
            this.found = found;
        }

        public String getIndex() {
            return index;
        }
        public void setIndex(String index) {
            this.index = index;
        }
        public boolean isFound() {
            return found;
        }
        public void setFound(boolean found) {
            this.found = found;
        }
    }
}

答案 3 :(得分:0)

public class SequencialSearcher {

    public static int SequencialSearchInt(int[] inputArray, int key)
    {

        for(int i=0; i < inputArray.length ; i++)

        {
            if(inputArray[i] == key)
            {
                return i;
            }
        }
        return -1;
    }
    public static int SequencialSearchString(String[] array, String key)
    {

        for(int i=0; i < array.length ; i++)

        {
            if(array[i] == key)
            {
                return i;
            }
        }
        return -1;
    }
    public static int SequencialSearchFloat(double[] array, double key)
    {

        for(int i=0; i < array.length ; i++)

        {
            if(array[i] == key)
            {
                return i;
            }
        }
        return -1;
    }

    public static void main (String args[])
    {
        //select the type of the elements of search
        //1 if integers
        //2 if float
        //3 if string
        int x = 3;
        int[] array1 = {9, 0, 10, 8, 5, 4, 6, 2, 3};
        double[] array2 = {9.0, 0.0, 10.0, 8.0, 5.0, 4.0, 6.0, 2.0, 3.0};
        String[] array3 = {"aa","hey", "hello"};
        if(x == 1){
            //enter the integer you want to search for here below
            int requiredValue = 5;
            int result = SequencialSearchInt(array1, requiredValue);
            if (result != -1)
                {
                System.out.println("Required Value: "+requiredValue+" found at index: "+result);
                }
            else
                {
                System.out.println("Value:"+requiredValue+" not found");
                }
        }
        else if(x == 2)
        {
            //enter the double you want to search for here below
            double requiredValue1 = 5.0;
            int result = SequencialSearchFloat(array2, requiredValue1);
            if (result != -1)
                {
                System.out.println("Required Value: "+requiredValue1+" found at index: "+result);
                }
            else
                {
                System.out.println("Value:"+requiredValue1+" not found");
                }
        }
        else if(x == 3){
            //enter the string you want to search for here below
            String requiredValue2 = "hey";
            int result = SequencialSearchString(array3, requiredValue2);
            if (result != -1)
                {
                System.out.println("Required Value: "+requiredValue2+" found at index: "+result);
                }
            else
                {
                System.out.println("Value:"+requiredValue2+" not found");
                }
        }
        else{
            System.out.println("Error. Please select 1,2 and 3 only");
        }
    }
}