Попытка сравнить продажи в списке массивов на Java

1

Хорошо, вот моя проблема. Я пытаюсь сравнить годовые продажи двух или более торговых представителей в 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 долл. Без малейшего количества того, что я вводил. Я обращаюсь к каждой продаже объектов неправильно? Мне кажется, что я столкнулся с этой проблемой раньше, но просмотр моего предыдущего кода не указывает на то, что я делаю неправильно.

Теги:
arrays

3 ответа

1

Я не вижу, что вы вызываете 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 будет продавцом с наивысшими объемами продаж, а последний элемент будет продавцом с наименьшими объемами продаж. Разностные вычисления тогда будут куском пирога.

0

Добавьте @override аннотацию к вашему методу toString и переместите отчет, лежащий так:

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

toString который вы вызываете, - это метод, унаследованный от Object. Метод toString который вы определили, принимает параметр String.

System.out.print(testName.toString());

поэтому переопределите правильный метод.

или используйте возвращаемый String из вашего метода.

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню