2013-02-13 3 views
2

Привет, я составил этот класс, чтобы добавить в строковые массивы и удалить из них элементы. Я также сделал один, который подготавливает группу значений для записи в файл csv. Однако я хотел бы сделать это так, чтобы он принимал любое значение (для первых двух методов, поскольку последний всегда будет строкой). Как мне сделать это общим? И п.с. я знаю, что я не должен посылать два аргумента измерения для 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; 
    } 
} 

ответ

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

Edit:

Видимо, чтобы создать новый массив, это должно быть сделано так:

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

Вам нужно переместить '' вправо после 'static'. – rees

+0

@rees - это может привести к ошибке компилятора. –

+1

нет, это Java. ваше решение не будет компилироваться. – rees

1

Было бы лучше использовать список, или еще лучше, объект, содержащий список, вместо строки []. Тогда вам не придется писать свои собственные методы для добавления элементов в массивы.

Если вы действительно хотите использовать массивы по какой-то причине, это довольно сложно, так как следующее незаконно:

T[] myNewList = new T[]; 

компилятор не имеет информации во время выполнения, чтобы знать, что T, когда вы вызов метода (из-за стирания типа). Вы можете подделывать его различными способами, такими как использование ArrayList.toArray(), но я бы просто полностью устранил проблему и использовал списки, как упоминалось выше.

Однако, для CSV, я не уверен, почему вы хотите ничего, кроме Strings, в любом случае. Файлы CSV представляют собой списки списков строк.

+0

, я не хочу ничего делать с помощью метода csv.Я только хочу сделать это с двумя другими массивами. – DavyGravy