2013-09-26 31 views
-1

我试图制作一种方法,可以在ArrayList中搜索特定的整数或字符串。 我已经设法让它搜索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; 
} 

}

我得到的错误是在

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

我“不能让一个静态引用非静态型T”新的泛型,我真的很感激一些帮助!

回答

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

要在不对的创建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 

参考文献:

0

让没有参数T类,并定义参数T

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

静态函数所以,你可以调用Search.linearSearch(...)

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