2011-08-25 77 views
7

我正在處理一個需要我具有數組的字符串表示形式的項目。問題是有這個重複的代碼,我敢肯定可以以某種方式重構,但我還沒有找到。檢測數組是否包含整數或雙精度值

private static String printDoubleArray(String title, double[] array){ 
    String result = title; 
    for (double d : array) { 
     result += d + " "; 
    } 
    return result; 
} 

private static String printIntArray(String title, int[] array){ 
    String result = title; 
    for (int d : array) { 
     result += d + " "; 
    } 
    return result; 
} 

在此先感謝。

+1

我認爲你必須忍受重複。所有的JDK API都是這樣做的。你應該做的是使用StringBuilders。 – Thilo

+0

如果你想減少重複,你可以嘗試使用Arrays.toString(double [])和Arrays.toString(int []);) –

+0

Java泛型的問題是它不支持原語。因爲這個原因,我已經多次看到人們實現他們自己的'IntSet','DoubleSet',[爲了防止拳擊開銷] ...不僅他們不能使用java.util。集合「,他們也必須複製代碼,因爲與原語相同的問題。 – amit

回答

2

爲什麼不使用的方法Arrays.toString(...)java.util包嗎?

int[] intArray = {1, 2, 4}; 
double[] doubleArray = {1.1, 2.2, 4.4}; 
System.out.println(Arrays.toString(intArray)); 
System.out.println(Arrays.toString(doubleArray)); 
+0

一個很好的方法,但我需要控制輸出的格式 –

+0

使用查找和替換文本方法。你可以用''「替換'','''',然後刪除'['和']'字符以獲得你在問題中提供的輸出。 –

0

您可以使用包裝類Integer和Double替代int和double。使用它們的基類寫入一個方法Number

+3

不幸的是,我們不能將'double []''轉換成'Double []'(例如),所以我們必須創建一個新的包裝數組並且一個接一個地複製所有的值 - 爲此,我們必須分離處理每個原語的數組並創建重複的代碼;)(順便說一句 - 有同樣的想法) –

+0

爲什麼downvote。答案在技術上是正確的(儘管它可能不是OP正在尋找的東西)。 – sleske

4

您可以使用java.lang.reflect.Array,它允許訪問陣列中任何時間的元素。見get(arr, index)getLength(arr)

+0

然後他的方法簽名將是'printArray(String title,Object intOrDoubleArray')?似乎放棄了類型安全(可能還有一些運行時反射的性能)。 – Thilo

+0

@Thilo:是的,沒錯。這就是你在Java中使用基元的原因。在Java中,原語確實是原始的,並且不享受「真實」類型所帶來的許多好處,例如多態。 – sleske

2

你的問題的解決方案是這樣的:

public class Test { 

    public static String numberArrayToString(Number[] arr) { 

     if (arr == null) return ""; 

     StringBuilder sb = new StringBuilder(); 

     for (Number n : arr) { 
      sb.append(n.toString()).append(" "); 
     } 

     return sb.toString(); 

    } 

    public static void main(String[] args) { 

     Integer[] intArr = { 1, 4, 6, 7 }; 
     Double[] dblArr = { 33.44, 55.66, 11.22 }; 

     System.out.println(numberArrayToString(intArr)); 
     System.out.println(numberArrayToString(dblArr)); 

    } 

} 

它產生這樣的:

1 4 6 7 
33.44 55.66 11.22 

但是,如果你定義一個盒裝元的陣列(僅適用即子類Number),但不包含原語(即,int[]double[])。

問題是,使用盒裝原語確實效率低下。

+1

如何將現有的int []和double []轉換爲Integer []或Double []? [提示:代碼重複] – amit

+1

這是整個問題,你將不得不創建一個新的int []並通過Integer []循環,這也是完全沒有效率的。現實是:你應該實現你的方法的多個版本。 – JVerstry

+0

Arrays.toString()可以幫助你,但它的格式不一樣... – JVerstry

1

使用guava,您可以使用Ints將基本數組(int [])轉換爲包裝類型列表(List)。此外,您可以使用Joiner

Joiner.on(' ').join(Ints.asList(new int[]{1,2,3})); 

的方法則是:

void printIntArray(String title, int[] array) { 
    printArray(title, Ints.asList(array)); 
} 

String printArray(String title, Iterable<? extends Number> asList){ 
    return title + " " + Joiner.on(' ').join(asList); 
} 
2

我會使用commons-lang創建字符串創建使用Object[]數組作爲這樣

int[] intArray = ...; 
String str = printArray(title, ArrayUtils.toObject(intArray)); 

double[] doubleArray = ...; 
String str = printArray(title, ArrayUtils.toObject(doubleArray)); 

public static void printArray(String title, Object[] array) { 
    return title + " " + StringUtils.join(array, " "); 
} 

注打印方法,這在內部將複製的陣列,其將框的整數到整數對象,所以如果數組的性能/大小是一個問題,我會硬着頭皮爲基元類型創建方法,但我會調用所有方法printArray並用不同的類型重載它。

編輯:

相反公地郎,你可以使用Guava元,這將不會複製陣列(但是會autobox在列表中的彩車),所以你可以這樣做:

int[] intArray = ...; 
String str = printArray(title, Ints.asList(intArray)); 

double[] doubleArray = ...; 
String str = printArray(title, Floats.asList(doubleArray)); 
相關問題