尝试在Java中比较数组列表中的销售代表

尝试在Java中比较数组列表中的销售代表,java,arrays,Java,Arrays,好的,这是我的问题。我试图比较ArrayList中两个或两个以上销售代表的年销售额,但得到了一些奇怪的结果,我就是搞不清楚。我必须将两者进行比较,然后告诉用户,销售额较低的销售代表需要销售多少才能领先。我把它分成三个班。但我很确定这一行为只取决于其中的两个。第一个是: import java.util.ArrayList; /** * * @author Cameron */ public class SalesRep { private ArrayList<Compensati

好的,这是我的问题。我试图比较ArrayList中两个或两个以上销售代表的年销售额,但得到了一些奇怪的结果,我就是搞不清楚。我必须将两者进行比较,然后告诉用户,销售额较低的销售代表需要销售多少才能领先。我把它分成三个班。但我很确定这一行为只取决于其中的两个。第一个是:

import java.util.ArrayList;

/**
 *
 * @author Cameron
 */
public class SalesRep {

private ArrayList<CompensationCalculator> pool;

public SalesRep(){

    pool = new ArrayList<>();

}

public void setPool(ArrayList<CompensationCalculator> pool){

    this.pool = pool;

}

public ArrayList<CompensationCalculator> getPool(){

    return pool;

}

public void addToPool(CompensationCalculator salesRep){

    pool.add(salesRep);

}

public String toString(String report){

    double diff;

    for(int i=0; i<pool.size(); i++){

        if (pool.get(i).getSales() < pool.get(i++).getSales()){

            diff = pool.get(i++).getSales() - pool.get(i).getSales();
            report = pool.get(i).getName() + "needs to sell " +
                    diff + " to take the lead.";
        }            

        if (pool.get(i).getSales() > pool.get(i++).getSales()){

            diff = pool.get(i).getSales() - pool.get(i++).getSales();
            report = pool.get(i++).getName() + "needs to sell " +
                    diff + " to take the lead.";
        }  

        }
    return report;
    }
}
现在没有发现错误,程序编译和执行没有问题。但结果我

`[补偿计算器。CompensationCalculator@55f96302,补偿计算器。CompensationCalculator@55f96302]补偿计算器。SalesRep@3d4eac69"

我非常困惑,已经研究了三个小时了,所以我确信我需要一双新的眼睛。任何帮助或指导都将是惊人的

编辑:

好的,所以你建议使用一个比较器非常有用。我还把自己和不必要的代码搞混了,所以我对它做了一点修改,现在除了一个方面外,它还在工作。以下是我更改的代码:

public String compare(SalesRep rep1, SalesRep rep2){

    NumberFormat fmt = NumberFormat.getCurrencyInstance();
    Double diff;

    if (rep1.getSales() > rep2.getSales()){
        diff = rep1.getSales() - rep2.getSales();
        return rep2.getName() + " needs to sell " + fmt.format(diff) +
                " to take the lead.";}
    else{
        diff = rep2.getSales() - rep1.getSales();
       return rep1.getName() + " needs to sell " + fmt.format(diff) +
               " to take the lead.";}                 
       }

我还重新命名了我的类,以便更好地组织它们以满足新的需求。现在唯一的问题是,它给出了两次销售的差额,即0.0美元,这与我输入的不一样。我是不是打错电话了?我觉得我以前遇到过这个问题,但回顾我过去的代码并没有突出我做错了什么。

我看不到您调用
toString(String)
,而只调用
toString()
,这就是为什么您会得到“stange”输出

顺便说一句,您的
toString(String)
方法的
report
参数似乎很奇怪,因为除了赋值之外,您没有使用它。在这种情况下,应该使用局部变量

另一个潜在错误:

if (pool.get(i).getSales() > pool.get(i++).getSales()){
  diff = pool.get(i).getSales() - pool.get(i++).getSales();
  report = pool.get(i++).getName() + "needs to sell " +
           diff + " to take the lead.";
}  
在这里,您将递增
i
三次,因此您将在
池中引用3个不同的索引。
假设
i=0
,则您将得到:

//the first i++ returns i (0) and then increments i to 1
if (pool.get(0).getSales() > pool.get(0).getSales()){
  //here i is 1, thus the next i++ returns 1 and increments i to 2
  diff = pool.get(1).getSales() - pool.get(1).getSales();
  //here i is 2, so the next i++ returns 2 and increments i to 3 
  report = pool.get(2).getName() + "needs to sell " +
           diff + " to take the lead.";
}  
因此,在第二种情况下,您将向
i
添加3,从而使循环前进4,因为循环头中的
i++
也会再次增加i。我建议您在循环体中使用
I+1
,而不是
I++

除此之外,您的设计非常奇怪,因为class
CompensationCalculator
实际上似乎定义了一个销售代表


另一件事:我可能会按降序对销售代表列表进行排序(提示:使用
比较器
)。然后,元素0将是销售额最高的销售代表,最后一个元素将是销售额最低的销售代表。差异计算将是小菜一碟。

您正在调用的
toString
是从对象继承的方法。您定义的
toString
方法采用
String
参数

System.out.print(testName.toString());
因此,请重写正确的方法

或者使用方法返回的
字符串

String out;
 out = testName.toString(out);  // Strings are immutable

将@override注释添加到您的toString方法并将报告移入,以便:

@Override
public String toString(){
  String report;
  .....
}
@Override
public String toString(){
  String report;
  .....
}