2012-12-09 76 views
1

我一直在這裏工作了幾個小時,我覺得(我希望)我很快就能搞清楚了。這個程序從一個外部文件讀入一堆值,並將它們放入一個對象數組中,這似乎工作得很好。排序對象數組時,利用Comparable對2個排序條件進行排序

的對象屬性是:
銀行帳號 客戶名稱 銀行賬戶餘額

我可以輸出他們的帳號順序(那怎麼他們從文件中讀取的,不排序是必要的)

2.我設置的方法,由實施可比的銀行賬戶餘額進行排序和它的正常工作。

3.我需要第二個排序方法,按客戶名稱排序。 - 我遇到的問題是基於我所做的研究和我嘗試過的,我得出的結論是,使這項工作的唯一方法是構建我自己的可比較對象(對不起如果我的術語是傾斜的。)我已經多次嘗試這個,同時對Java文檔和SE上的一些類似問題也進行了多次嘗試。

當所有事情都說完之後,我會將一些聽衆放入我的複選框組中,以允許用戶切換不同的排序方法。

這裏是我工作的大塊:

public class bankAccounts implements Comparable<bankAccounts> { 
/* PRIVATE FIELDS HERE, FOLLOWED BY TYPICAL GET AND SET METHODS */ 

/*SORTS BY ACCOUNT BALANCE WORKING GREAT*/ 
public int compareTo(bankAccounts b) { 
    if (accountBalance < b.accountBalance) 
    { 
     return -1; 
    } 
    if (accountBalance > b.accountBalance) { 
     return 1; 
    } 
    return 0; 
} 


     /* BEGIN SNIPPET OF MAIN CLASS */ 


     /*METHOD I CALL FROM MAIN CLASS, SORTS BY BALANCE ^^ AS SEEN ABOVE */ 
Arrays.sort(retrievedAccounts); 
for (int i=0; i<retrievedAccounts.length; i++) { 
    String resultFull = Integer.toString(retrievedAccounts[i].getAccountNumber()) + retrievedAccounts[i].getAccountLastName() + Double.toString(retrievedAccounts[i].getAccountBalance()); 
     box.append(resultFull + "\n"); 
} 

/* NORMAL METHOD WHICH OUTPUTS IN ORDER OF ACCOUNT NUMBER, NO SORTING HAPPENING HERE */ 
     for(int x = 0; x < retrievedAccounts.length; ++x) 
{ 
    String resultFull=Integer.toString(retrievedAccounts[x].getAccountNumber()) + retrievedAccounts[x].getAccountLastName() + Double.toString(retrievedAccounts[x].getAccountBalance()); 
    box.append("\n\n\n" + resultFull + "\n\n"); 
} 

我希望有人會邁向下一步可能允許我完成這件事的一些見解。如果你有建議採取這個完全不同的方向,我也接受。

回答

0

這是一個想法還沒有測試過。

創建另一個私有方法來存儲compareType

public class bankAccounts implements Comparable<bankAccounts> { 

private int compareType = 0; // 0 - compare by balance 1-compare by name 

在您的比較方法

public int compareTo(bankAccounts b) { 
if(this.compareType == 0){ 
if (accountBalance < b.accountBalance) 
{ 
    return -1; 
} 
if (accountBalance > b.accountBalance) { 
    return 1; 
} 
return 0; 
}else{ 
return customerName.compareTo(b.customerName) 
} 
+0

好吧,現在它更接近....它是尊重compareType變量(真棒!)仍然沒有排序名稱權..我想我有我的.compareTo()方法有問題嗎? '公衆詮釋的compareTo(bankAccounts B)\t { \t \t如果(this.compareType == 0){ \t \t如果(accountBalance b.accountBalance)\t { \t \t \t返回1; \t \t} \t \t return 0; \t \t}否則{ \t \t \t如果(accountLastName.compareTo(b.accountLastName)> 0) \t \t \t { \t \t \t \t返回-1; \t \t \t} \t \t \t \t \t \t如果(accountLastName.compareTo(b.accountLastName)<0) \t \t \t { \t \t \t \t返回1; \t \t \t} \t \t \t return 0; \t \t} \t}' –

+0

當您按名稱測試時,必須將compareType等於1.您是否嘗試過? – Suranga

+0

是的。我將1傳遞給我構建的getCompareType()方法,並且我知道它正在工作,因爲它正在繞過Balance的排序。另外,當我將0傳遞給getCompareType()方法時,它會進行平衡排序。我認爲可能有問題,我的'(accountLastName.compareTo(b.accountLastName)> 0){返回-1; '陳述。我現在正在做一些研究,看看如果我能弄明白。 –

0

使用Comparator<bankAccounts>的實現來比較對象的名稱並將其傳遞給Arrays.sort()方法。

使用匿名類是這樣的:

Arrays.sort(retrievedAccounts, new Comparator<bankAccounts>() { 
    public int compare(bankAccounts a, bankAccounts b) { 
     return a.getName().compareTo(b.getName()); 
    } 
}); 

此代碼假定你有bankAccounts一個getter方法稱爲客戶名稱getName()
你會很好地遵循Java命名約定:

  • 班級名稱以大寫字母開頭
  • 班級名稱爲單數,不是複數
+0

現在嘗試這個。謝謝! –

+0

我當然有知識差距,使我無法理解如何實現這一點。所以'返回name.compareTo(b。名稱);'我在bankAccounts類中構建的compareTo的路線? –

+0

@Josh我的壞 - 我編寫了錯誤的方法(我正在使用我的iphone和從內存中去)。現在查看答案。 – Bohemian