通用线性搜索 - 无法使用字符串在ArrayList中搜索

时间:2013-09-26 12:58:15

标签: java

我正在尝试创建一个方法,我可以在其中搜索ArrayList中的特定整数或字符串。 我已经设法让它在ArrayList中搜索整数,但是当我试图搜索字符串时,我无法正常工作。 这是我的代码:

    import java.util.*;
public class Search <T> {


public static void main(String[] argv) {

    Search<T> search = new Search<T>();

    ArrayList<Integer> alist = new ArrayList<Integer>();
    alist.add(1);
    alist.add(3);
    alist.add(5);
    alist.add(7);

    int num = 5;


    ArrayList<String> alist2 = new ArrayList<String>();
    alist2.add("A");
    alist2.add("B");
    alist2.add("C");
    alist2.add("D");

    String word = "C";


    System.out.println(search.linearSearch(alist, num));

    System.out.println(search.linearSearch(alist2, word));


}

public int linearSearch(ArrayList<T> rrr, T wordnum) {
    for (int i=0; i < rrr.size(); i++) {
        if (wordnum.equals(rrr.get(i))) {
            return i;

        };
    };
    return -1;
}

}

我得到的错误是“无法对非静态类型T进行静态引用”

Search<T> search = new Search<T>();

我是仿制药的新手,我真的很感激一些帮助!

3 个答案:

答案 0 :(得分:3)

当您声明Search时,它必须由某个类进行参数化。 在你的情况下它是

Search<Integer> search = new Search<Integer>();//to find int
Search<String> search = new Search<String>();//to find string

假设您的Search班级

class Search<T> {
    public int linearSearch(ArrayList<T> rrr, T wordnum)...
}

答案 1 :(得分:1)

您在不正确的情况下创建Search课程实例的方式。

Search<T> search = new Search<T>();

这不会编译。您需要在创建实例时传递实际的类型参数。那是因为你不能在静态上下文中使用类型参数。


要使用泛型方法,必须为特定类型参数创建实例。然后使用该实例调用该方法将正常工作:

Search<String> stringSearch = new Search<String>();
search.linearSearch(alist2, word);  // Type `T` is now String.

同样,您必须为Integer执行此操作。


话虽如此,你并不需要让你的Search类具有通用性。相反,您可以使方法本身具有通用性,同时使类非通用:

class Search {

    /** For generic method, you define the type parameter in angular brackets, 
        before the return type
    **/
    public <T> int linearSearch(ArrayList<T> rrr, T wordnum) {
        for (int i=0; i < rrr.size(); i++) {
            if (wordnum.equals(rrr.get(i))) {
                return i;
            }
        }
        return -1;
    }
}

然后正常创建Search的实例,并调用此方法。将根据您传递的列表推断类型:

Search search = new Search();

System.out.println(search.linearSearch(alist, num));   // T inferred as Integer
System.out.println(search.linearSearch(alist2, word)); // T inferred as String

<强>参考文献:

答案 2 :(得分:0)

使类不带参数T,并使用参数T <。p>定义静态函数

public static <T> int linearSearch(List<T> rrr, T wordnum) {

因此,您可以致电Search.linearSearch(...)

否则@NKukhar的答案应该已经完成​​。 另外,在API中启用List是更好的样式(比ArrayList更通用)。