2015-07-21 40 views
2

我想將方法​​轉換爲通用的CharSequence []和Set。那麼我沒有經驗。使方法通用到CharSequence []和設置<String>

這是第二個參數/返回值應該是通用(T)的方法。可能嗎?

private CharSequence[] remove(String string, CharSequence[] charSequences) 
    { 
     ArrayList<CharSequence> newArray = new ArrayList<CharSequence>(); 
     int foundPlace = -1; 
     CharSequence[] v = charSequences; 
     for (int i = 0; i < v.length; i++) { 
      if (foundPlace != -1 && v[i].equals(string)) 
       foundPlace = i; 
      else 
       newArray.add(v[i]); 
     } 
     return newArray.toArray(new CharSequence[newArray.size()]); 
    } 

我試過了。將CharSequence []出現的位置替換爲T,但當我將T放入行T.length時,它不起作用。


更多解釋(對不起)。我想將第二個參數和返回值轉換爲T - 所以到處CharSequence []到T的位置。

+0

你是否真的想要在泛型中傳遞CharSequence []作爲此方法的第二個參數?這是不值得的努力! –

+0

您不能創建一個泛型類型的數組,以便您的return語句不起作用:return newArray.toArray(new CharSequence [newArray.size()]); –

+0

@ShishirKumar是的,給T – deadfish

回答

3

也許這是你想要什麼:

private <T> T[] remove(T string, T[] charSequences) 
    { 
     ArrayList<T> newArray = new ArrayList<T>(); 
     int foundPlace = -1; 
     T[] v = charSequences; 
     for (int i = 0; i < v.length; i++) { 
      if (foundPlace != -1 && v[i].equals(string)) 
       foundPlace = i; 
      else 
       newArray.add(v[i]); 
     } 
     @SuppressWarnings("unchecked") 
     T[] ret = (T[]) Array.newInstance(v.getClass().getComponentType(), newArray.size()); 
     return newArray.toArray(ret); 
    } 

或者,如果含有類也應該是通用的T型只是從上面卸下<T>。所以這條線,

private <T> T[] remove(T string, T[] charSequences) 

然後會成爲,

private T[] remove(T string, T[] charSequences) 

如果string類型並不重要,你可能會改變其類型爲純Object

private T[] remove(Object string, T[] charSequences) 
    { 
     ArrayList<T> newArray = new ArrayList<T>(); 
     int foundPlace = -1; 
     T[] v = charSequences; 
     for (int i = 0; i < v.length; i++) { 
      if (foundPlace != -1 && v[i].equals(string)) 
       foundPlace = i; 
      else 
       newArray.add(v[i]); 
     } 
     ... 
    } 

您可能還想將string重命名爲其他內容。


我也應該注意到,在你的邏輯,foundPlace永遠是-1

+0

@Json Sparc你不能創建一個通用數組,你的代碼片段的return語句將不起作用。 http://stackoverflow.com/questions/2927391/whats-the-reason-i-cant-create-generic-array-types-in-java –

0

泛型和數組可能是一個相當痛苦的組合。我會堅持List接口,如果這是你的選擇(即將返回類型更改爲List並簡單地返回也是List類型的newArray)。

否則我推薦這篇文章,以更好地理解泛型和數組: How to create a generic array in Java?

編輯:哦,你絕對不希望更換「的CharSequence []」與「T」,但有可能進行「T []「如果你確實需要在這裏處理數組。

0

要實現一個泛型集合,使用方法:

int length; // ... 
T[] array = (T[])new Object[length]; 

因此,return語句會是這樣的:

return (T[])newArray.toArray(new Object[newArray.size()]); 
1
  • 您可以使用一個整數foundPlace但布爾足夠,因爲你只要測試它是否已經初始化並且不使用它的值。
  • 你甚至不需要這個布爾,你的equals測試不會求,因爲foundPlace將始終等於-1(所以你返回數組始終是複印件)
  • 你不需要中介變量v,你可以簡單地遍歷

這裏是對象的一個​​版本,如果是你在找什麼:

private Object[] remove(Object val, Object[] array) 
    { 
     ArrayList<Object> newArray = new ArrayList<Object>(); 
     for (Object o : array) 
      if(!o.equals(val)) 
       newArray.add(o); 
     return newArray.toArray(new Object[newArray.size()]); 
} 
0

這裏是如何實現刪除例程的。請注意,您甚至不需要單獨的刪除方法。我希望,我不會錯過一個用例,需要您創建一個單獨的刪除方法。

package com.anupam; 

import java.util.Arrays; 
import java.util.HashSet; 
import java.util.Set; 

public class SO31535852 { 
    public static void main(String args[]) { 
    String[] arr = {"1", "2", "3"}; 

    // Create a copy of the orginal array if you do not want to modify it. 
    Set<String> test = new HashSet<>(Arrays.asList(Arrays.copyOf(arr, arr.length))); 

    // In fact you do not even need a remove method. I could not understand why you are using 
    // foundPlace variable it's not doing much. 
    System.out.println(remove("1", test)); 
    System.out.println(remove("1", test)); 
    } 

    /** 
    * Removes a specific value from the underling collection 
    * 
    * @param toRemove the object to be removed 
    * @param myCollection the colelction from which to be removed 
    * @return the removed value or null. 
    */ 
    private static <T> T remove(T toRemove, Set<T> myCollection) { 
    return myCollection.remove(toRemove) ? toRemove : null; 
    } 
} 
相關問題