Хорошо, вот моя проблема. Я пытаюсь сравнить годовые продажи двух или более торговых представителей в 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;
}
}
Этот класс должен сравнивать два повтора в массиве, пока он отображает его пользователю:
import java.util.Scanner;
public class AnnualSales {
public static void main(String[] args){
CompensationCalculator test = new CompensationCalculator(); //Creates a new instance of the class
SalesRep testName = new SalesRep(); //Creates a new instance of the SalesRep class
String cont = new String(); //A string to represent if there ar emore names to be added
Scanner scan = new Scanner(System.in); //Allows for user input to be read
while (!cont.equalsIgnoreCase("n")){
System.out.println("What is the name of the sales representative? ");
test.setName(scan.next());
System.out.println("Please enter " + test.getName() +
" annual sales: ");
test.setSales(scan.nextDouble());
testName.addToPool(test);
System.out.println("Are there any more sales representatives you "
+ "would like to add? ");
cont = scan.next();
}
System.out.print(testName.getPool());
System.out.print(testName.toString());
}
}
Теперь ошибок не обнаружено, программа компилируется и выполняется без проблем. Но в результате я получаю
'[calculatorcalculator.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()
, поэтому вы получите этот "стабильный" вывод.
Кстати, этот параметр report
вашего метода toString(String)
кажется довольно странным, поскольку вы не используете его помимо назначений. В этом случае вы должны использовать локальную переменную.
Другая потенциальная ошибка:
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 разных показателя в pool
. Предположим, что 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.";
}
Таким образом, в этом втором случае вы добавляете 3 в i
и, таким образом, продвигаете цикл на 4, так как i++
в головке цикла также увеличивает я еще раз. Я предлагаю вам использовать i + 1
в вашем i++
цикла вместо i++
.
Кроме того, ваш дизайн довольно странный, так как класс CompensationCalculator
самом деле, похоже, определяет репутацию продавца.
Другое дело: я бы, наверное, отсортировал список продавцов в порядке убывания (подсказка: используйте Comparator
). Тогда элемент 0 будет продавцом с наивысшими объемами продаж, а последний элемент будет продавцом с наименьшими объемами продаж. Разностные вычисления тогда будут куском пирога.
Добавьте @override аннотацию к вашему методу toString и переместите отчет, лежащий так:
@Override
public String toString(){
String report;
.....
}
toString
который вы вызываете, - это метод, унаследованный от Object. Метод toString
который вы определили, принимает параметр String
.
System.out.print(testName.toString());
поэтому переопределите правильный метод.
или используйте возвращаемый String
из вашего метода.
String out;
out = testName.toString(out); // Strings are immutable