2011-06-07 140 views
43

這是一個小問題,因爲我可以輕鬆地組成一對班來完成這項工作。我不想這樣做,我覺得應該有一些簡單的,內置的,類似於java的方式來返回兩個值。你們是做這件事的最好,最簡單的方法?陣列?其他一些數據結構?在Java中返回一對值的最佳方式是什麼?

+8

Java的方式_is_創建儘可能多的類:p(僅部分意味着作爲一個笑話...) – 2011-06-07 21:18:13

+0

另請參見相關但不同的主題http://stackoverflow.com/questions/457775/does-java-需要元組。 – 2011-06-07 21:19:00

+0

相關:https://stackoverflow.com/questions/2832472/how-to-return-2-values-from-a-java-method – 2017-05-25 10:07:16

回答

29

據我所知,不幸的是沒有在Java中的一對內置表示(我當然希望有)。就我個人而言,當我編寫一個項目時,我發現一對類通常會很有用,我創建了一個通用的Pair<T, U>類(這可能就是您所想的)。返回一個數組是一種快速而簡單的方法,但是稍後您可能會後悔,因爲使用您的方法的人會懷疑該方法是否會返回兩個以上的值。

無論您選擇哪種解決方案:只要您覺得需要配對,您應該考慮是否通過使用例如今天保存的時間。一個普通的Pair類真的值得向下一個閱讀代碼的人丟失信息(而且這個人可能在六個月內就是你)。爲返回類型編寫一個單獨的類現在需要更多時間,但它會向使用您的方法的用戶傳達更多信息(即告訴用戶返回值代表什麼,並且包含這兩個值的有用成員名稱)。如果它是一種僅用於少數地方的非公開方法,則Pair更可接受。

+3

但是,如果你是一個在混亂中興旺發達的人,那麼你可以將這些對子嵌套在一起!例如,返回一對 >> – 2011-06-07 22:28:27

+2

@ Sam Barnum:當然 - 我承認我自己做了幾次。 :p雖然後來看起來不是很愉快,但是......(另一方面,在LISP中,所有列表都以這種方式表示,只有更漂亮的語法。) – 2011-06-07 22:31:03

+1

@Sam Barnum,我喜歡嵌套成對的對梨也是! – Atreys 2011-06-08 02:01:40

-1

如果兩個都是整數,然後我會建議java.awt.Point中,但只是否則創建兩個對象x和y

+4

我建議不要這樣做,因爲它會讓所有讀取方法聲明的人相信返回值代表一個幾何點。 – 2011-06-07 21:17:55

+1

在我目前工作的環境中,我認爲這是一個很好的解決方案,因爲我返回了兩個整數。我忘了Point,謝謝你帶來這個。 – Graham 2011-06-07 21:20:19

+5

@格拉漢姆:如果這兩個整數確實代表一個幾何點,那麼它很好;否則,在六個月內閱讀你的代碼的人(這個人可能就是你自己了)會被誤導以相信你的方法返回一個幾何點(雖然它真的返回,比如說除法運算的商和餘數),並且由於誤解而浪費的時間很容易超過你今天創建Pair類或更具體的類所需的時間。切勿僅因爲「它具有正確類型的字段」而使用類。 – 2011-06-07 21:31:46

12

我在標準看到一個「對」最接近的一個容器類庫是實現它的類Map.Entry接口和AbstractMap.SimpleEntryAbstractMap.SimpleImmutableEntry類。

如果兩個對象都是相同的類,則數組更容易使用。

25

使用容器類是最簡單的方法。

public class Pair<T, U> {   
    public final T t; 
    public final U u; 

    public Pair(T t, U u) {   
     this.t= t; 
     this.u= u; 
    } 
} 
2

三種方法,都沒有那麼大:

  1. 滾你自己Pair<A, B>。你說你不想這樣做。
  2. 返回一個Object[]。這不是安全的。
  3. 模仿輸出變量指針通過提供單個元素數組作爲參數。

的#3的例子:

public boolean getUserDetails(String userId, String[] lastName, String[] firstName, Date[] dob) { 
    assert lastName != null && lastName.length == 1; 
    assert firstName != null && firstName.length == 1; 
    assert dob  != null && dob.length  == 1; 
    ... 
} 

第三個選項使生活痛苦呼叫者。

所以就像我說的,沒有很好的解決方案。另外,Scala使用各種各樣的Tuple類(從我所記得的最多21個元組)來幫助你。

0

有人告訴我,專家認爲,當面對對的問題,兩件事情之一是真的:

  1. 你需要重新思考你的結構(這種生硬的回答並不能幫助任何人)
  2. 你需要建立你自己的班級來容納這對

我會建議,第二種情況並不是所有的異常。但是,如果您正在做的事情對於引入一個新班級似乎太過簡單,那麼可以使用 ,正如其他人所建議的那樣工作。如果你只是簡單地發送一個單一的響應,那麼Map似乎有點多。

如果對的列表聽起來像是可以工作的,並且您需要維護訂單,則可以嘗試LinkedHashMap,以便維護訂單。

+0

如果你想濫用映射到返回對,爲什麼不使用AbstractMap的SimpleImmutableEntry? https://docs.oracle.com/javase/8/docs/api/java/util/AbstractMap.SimpleImmutableEntry.html 這是完全沒有關於什麼對的信息,以及它如何使用Map返回一對,除了你知道它只包含兩個值。還有這個: https://docs.oracle.com/javase/8/javafx/api/javafx/util/Pair.html 如果你真的*想要使用一對。但我不同意這個直截了當的答案是無益的。它應該引發你至少問:「但是,爲什麼?」。 – 2017-08-11 10:08:20

3

Apache Commons Lang3提供了一個抽象的Pair類,包含ImmutablePair和MutablePair等幾個實現。

0

一些觀察我的:

  1. 數組儲存卡式,快速,易於使用,雖然IMPOSIBLE擴大其產能。如果您希望3個月後返回3個值,該怎麼辦?

  2. ArrayList /其他收集可以很好,允許您增加容量(最初10)。 請注意,與ArrayList相比,Vector只能在稍後存儲兩個值時纔可以矯正。地圖也可以很好,因爲它總是被排序和排序。

  3. 某些用戶定義的類:如果有意義(也就是說返回的數據很重要,可能是Java Bean),並且您希望將更多的整數存儲在其中。如果您在其Javadoc中添加更多筆記,可讀性會更好。可以隨意擴展,只需在該類中添加字段即可。更慢,但更安全。

0

JavaFX中有一個類對象,但不應該使用它。你應該用的是這樣的:

// We've skipped imports and package declarations 
public final class YourClass { 
    /* Assume there is a bunch of stuff here */ 

    // I don't know what method you're using, so forgive the silly example 
    public YourClass.Pair sillyExampleOfPairs(String someString) { 
    return new YourClass.Pair(someString, someString.length() * 13); 
    } 

    @Value // Lombok annotation. 
    public static class Pair { 
    String text; 
    int integer; 
    } 

    // this is an even more succinct possibility 
    @Value public static final class ShorterPair {String text; int integer} 
} 

雖然這裏的名稱對顯然不是那麼好選擇,你應該選擇一個更具描述性的名稱,明顯的方式,這將工作(字段是最後的私人和每個人都有一個吸氣,因爲註釋)不應該在你身上丟失。當然,這比使用Pair稍微羅嗦一點,它更強大。如果你需要增加一個額外的參數給返回值?你「只」需要改變這個類。你可以立即更新所有相關的JavaDoc,這也很好。如果你不得不改變類型,他們都需要類似的工作量。

只要你只是添加東西,舊的getText()和getInteger()方法將繼續像以前一樣工作。您也避免必須爲您的項目添加另一個依賴項。這不是一個很大的勝利。擁有Pair可用於原型設計,但對於以後的設計來說並不好。

我最後的理論CS-Y論點是Pair與Pair相同。但是如果你有一個Phonebook.Entry(帶有String和int)並且說,Inventory。項目(有一個名稱和一些我們目前已經編目的項目),這兩個是非常不同的類型,它們做非常獨特的事情。你不能把其中一個放進去。這是一件好事。

這對我們來說也很清楚,因爲我們這些可憐的混蛋必須去調試你的系統才能在堆棧跟蹤中看到諸如「com.name.project.something.something.Phonebook.Entry」之類的東西,而不是「org.apache.commons .lang3.tuple.Pair」。其中一個告訴我,我應該看什麼,並給我一些信息,爲什麼我看到一對。另一個說...沒什麼。

現在你可能並不在意,你必須輸入3秒鐘以節省3分鐘。但我選擇相信你內心的善良和你靈魂的高貴。因此,做正確的事情。

改寫一個小靜態類。

相關問題