2012-12-09 39 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