2

こんにちは、文字列配列に追加して要素を削除するために、このクラスを作成しました。また、csv ファイルに書き込むための値のグループを準備するものも作成しました。ただし、任意の値を取得できるようにしたいと思います (最初の 2 つのメソッドでは、最後のメソッドは常に文字列になります)。ジェネリックにするにはどうすればよいですか? そして、ps csv ビルダーに 2 次元の引数を送信するべきではないことはわかっていますが、行の次元を取得する方法がわかりました。:)

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;
    }
}
4

2 に答える 2

3

ほとんどの場合、String[] を T[] に置き換えれば完了です。

これが最初のものです。ほとんどの場合、メソッド シグネチャを置き換え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;   
} 
于 2013-02-13T12:25:27.310 に答える
1

String []の代わりに、リストを使用するか、リストを含むオブジェクトを使用することをお勧めします。そうすれば、配列に要素を追加するための独自のメソッドを作成する必要がなくなります。

何らかの理由で本当に配列を使用したい場合、以下は違法であるため、かなり困難です。

T[] myNewList = new T[];

コンパイラには、メソッドを呼び出しているときにTが何であるかを知るための実行時の情報がありません(型消去のため)。ArrayList.toArray()を使用するなど、さまざまな方法で偽造できますが、前述のように、問題を完全に回避してリストを使用します。

ただし、CSVの場合、とにかく文字列以外のものが必要な理由はわかりません。CSVファイルは、事実上、文字列のリストのリストです。

于 2013-02-13T12:32:36.057 に答える