2016-01-22 43 views
0

我想在一個字段內存儲兩個基元值(我在這裏包括String作爲基元)。例如,我可能要存儲Stringint如下:Java類型,用於保存任何基元類型的兩個基元

("hello", 42) 

所以,如果我要找的是X類型,我希望能夠宣佈現場

private X myX = new X("hello", 42); 

或其他一些咒語給了我相同的結果。

我想弄清楚該字段必須是什麼類型。它必須接受任何Java原始類型和String,因此它可能是String + intString + float ...實際上是原始(+ String)類型的任意組合。基本上,從功能語言中借用一個概念,我只想要一個限於基元的tuple。但Java沒有。

由於它們是原始類型,泛型不能很好地工作。而且我不確定我對拳擊/拆箱的看法。

什麼是我可以在Java中使用的最佳數據類型/結構?

+1

你是什麼意思「所有類型」?所有基元類型+字符串(int,布爾值,短小,浮點等等)還是所有對象? – ParkerHalo

+0

Nop只是原始類型 –

+0

全部是對象 – Typo

回答

1

如果您確實想將這些值存儲爲一種基本類型,則必須對它們進行「編碼」。

例如:

String field = "hello;42"; 
String[] values = field.split(";"); 
int intValue = Integer.parseInt(values[1]); 
1

不要以爲有一種方法做它內置的Java庫。但是可以這樣寫出與Scala語言中的Tuple2類相同的Tuple類:

public class Tuple<K, V> { 
     private K first; 
     private V second; 

     // create tuple only with static method "of" 
     private Tuple(K first, V second) { 
      this.first = first; 
      this.second = second; 

     } 

     public static <K, V> Tuple<K, V> of(K a, V b) { 
      return new Tuple<K, V>(a, b); 
     } 

     public Tuple<V, K> swap() { 
      return new Tuple<V, K>(second, first); 
     } 

     public K getFirst() { 
      return this.first; 
     } 

     public V getSecond() { 
      return this.second; 
     } 

     @Override 
     public String toString() { 
      return "(" + first.toString() + "," + second.toString() + ")"; 
     } 

     public static void main(String[] args) { 
      Tuple myTuple = Tuple.of("hello", 2); 

      System.out.println("toString: "+myTuple); 
      System.out.println("First: "+myTuple.getFirst()); 
      System.out.println("Swap: "+ myTuple.swap()); 
     } 

    } 

    Output: 

    toString: (hello,2) 
    First: hello 
    Swap: (2,hello) 
0

Java沒有內置的Tuple類型。

您可能會使用標準Map.Entry<K,V>,但如果可能的話,我個人建議使用Apache Commons Lang3的Tuple類型。

1

由於您只處理原語(和String),因此您似乎希望儘可能避免自動裝箱和取消裝箱。這意味着你不能使用泛型。 (原始類型不能用作類型參數。)它也好像你想避免不必要的促銷(例如,如果你將floats作爲doubles存儲,你會保留原始值,但失去了它實際上是一個事實float)。

一個相當複雜的解決方案是創建一組PrimitivePair類,其中一個用於要存儲的基本類型的每種組合,以及一個用於輕鬆構建它們的工廠類。例如,您可能有以下三種類型來存儲基元的各種對:

package primitivepair; 

public class PrimitivePairStringInt 
{ 
    final String s; 
    final int i; 

    PrimitivePairStringInt(final String s, final int i) 
    { 
     this.s = s; 
     this.i = i; 
    } 

    public String getFirstValue() 
    { 
     return s; 
    } 

    public int getSecondValue() 
    { 
     return i; 
    } 
} 

package primitivepair; 

public class PrimitivePairFloatDouble 
{ 
    final float f; 
    final double d; 

    PrimitivePairFloatDouble(final float f, final double d) 
    { 
     this.f = f; 
     this.d = d; 
    } 

    public float getFirstValue() 
    { 
     return f; 
    } 

    public double getSecondValue() 
    { 
     return d; 
    } 
} 

package primitivepair; 

public class PrimitivePairCharByte 
{ 
    final char c; 
    final byte b; 

    PrimitivePairCharByte(final char c, final byte b) 
    { 
     this.c = c; 
     this.b = b; 
    } 

    public char getFirstValue() 
    { 
     return c; 
    } 

    public byte getSecondValue() 
    { 
     return b; 
    } 
} 

他們將通過下面的工廠類來創建:

package primitivepair; 

public class PrimitivePairFactory 
{ 
    public static PrimitivePairCharByte createPrimitivePair(final char c, final byte b) 
    { 
     return new PrimitivePairCharByte(c, b); 
    } 

    public static PrimitivePairFloatDouble createPrimitivePair(final float f, final double d) 
    { 
     return new PrimitivePairFloatDouble(f, d); 
    } 

    public static PrimitivePairStringInt createPrimitivePair(final String s, final int i) 
    { 
     return new PrimitivePairStringInt(s, i); 
    } 
} 

您當然可以添加更多班級和工廠m其他組合的方法。

我想作一個抽象類PrimitivePair,將有對getFirstValue()getSecondValue()方法創建方法方法聲明,但會要求返回類型的協方差適用於原語,我不相信確實。