这可以是Generic

时间:2013-02-13 12:22:43

标签: java generics

您好我编写了这个类来添加到字符串数组并从中删除元素。我还做了一个为写入csv文件准备一组值。但是,我想这样做,以便它将接受任何值(对于前两个方法,因为最后一个将始终是一个字符串)我如何使它通用所以? ps我知道我不应该为csv构建器发送两个维度参数,但我现在只知道如何获取行维度。:)

public class ManipulateList {

    public static String [] removeFromArray(String []old_array,int index) {

        String []old_vals = old_array;
        int old_length= old_vals.length;
        int new_length= old_length-1;
        String[] new_vals = new String[new_length];
        System.arraycopy(old_vals, 0, new_vals, 0, index); 
        if(index+1!=old_length) {
            System.arraycopy(old_vals, index+1, new_vals,index,old_length-1-index);
        }
        return new_vals;

    }

    public static String[] addToArray(String []old_array,String element) {

        String new_element=element;
        String[] old_vals = old_array;
        int old_length= old_vals.length;
        int new_length= old_length+1;
        String[] new_vals = new String[new_length];
        System.arraycopy(old_vals, 0, new_vals, 0, old_length);
        new_vals[old_length]=new_element; 
        return new_vals;
    }

    public static String[] createCsvList(String[][] lists, int contents1,int contents2){
        String[][] csvarray=new String[contents1][contents2];
        csvarray = lists;
        String[]newcsv=new String[contents2];
        StringBuilder newline = new StringBuilder();

        for (int i = 0; i<contents2;i++) {
            for (int j = 0; j<contents1;j++) {
                newline.append(csvarray[j][i]);
                if(contents1-j>1) {
                    newline.append(",");
                }
            }
            newcsv[i]=newline.toString();
            newline= new StringBuilder();
        }
        return newcsv;
    }
}

2 个答案:

答案 0 :(得分:3)

差不多,用T []替换String [],你已经完成了。

这是第一个。您会注意到我大多只是将String[]替换为T[]并将<T>添加到方法签名中。

public static <T> T[] removeFromArray(T[] old_array,int index)
{

    T[] old_vals = old_array;
    int old_length = old_vals.Length;
    int new_length = old_length - 1;
    @SuppressWarnings("unchecked") T[] new_vals = (T[]) Array.newInstance(old_array.getClass().getComponentType(), new_length);
    System.arraycopy(old_vals, 0, new_vals, 0, index); 
    if(index + 1 != old_length)
    {
        System.arraycopy(old_vals, index+1, new_vals, index,old_length - 1 - index);
    }

    return new_vals;
}

编辑:

显然,要创建一个新数组,必须这样做:

public T[] createArray(Class<T> cls, int size) throws Exception   
{   
    @SuppressWarnings("unchecked") T[] array = (T[])Array.newInstance(cls, size);   
    return array;   
} 

答案 1 :(得分:1)

最好使用List,或者更好的是,使用包含List的对象,而不是String []。然后,您不必编写自己的方法来向数组添加元素。

如果你真的想出于某种原因使用数组,这很难,因为以下是非法的:

T[] myNewList = new T[];

编译器在运行时没有信息来知道调用方法时的T是什么(由于类型擦除)。您可以通过各种方式伪造它,例如使用ArrayList.toArray(),但我只是完全避免问题并使用Lists,如上所述。

然而,对于CSV,我不知道为什么除了Strings之外你还想要什么。 CSV文件实际上是字符串列表的列表。