我确定最畅销产品的逻辑是否正确?
Is my logic to determine the most sold product correct?
我想确定 Stock 实例向量中销量最高的产品。
public void mostSold(Vector <Stock> temp){
System.out.println ("Generating Data... Please Wait!");
delay(650);
System.out.println ("-------Most Sold Product(s)-------");
for(int i = 0; i < temp.size(); i ++){
s = temp.elementAt(i); // Stock s = new Stock();
sold1 = s.getSold();
sold2 = msold.getSold(); //Stock msold = new Stock();
if(sold1 > sold2)
msold = s;
else if (sold2 > sold1)
msold = msold;
else if (sold1 == sold2){
equal = true;
}
}
if(!equal)
System.out.println (msold.toSold());
else{
System.out.println (msold.toSold());
System.out.println (s.toSold());
}
System.out.println ();
}
一开始执行的时候效果很好,但是如果我在一次执行中执行2次,控制台会同时输出mostSold和leastSold...!
输出!!
第一次运行:(工作正常)
Generating Data... Please Wait!
-------Most Sold Product(s)-------
Product Name: iphone
Product ID: 0123P
Quantity Sold: 10
Generating Data... Please Wait!
-------Least Sold Product(s)-------
Product Name: nexus
Product ID: 2345P
Quantity Sold: 1
第二次运行:
Generating Data... Please Wait!
-------Most Sold Product(s)-------
Product Name: iphone
Product ID: 0123P
Quantity Sold: 10
Product Name: htc one //WHY IS THIS DISPLAYED!!
Product ID: 3456P
Quantity Sold: 1
Generating Data... Please Wait!
-------Least Sold Product(s)-------
Product Name: nexus
Product ID: 2345P
Quantity Sold: 1
您可能拥有两只价值相等的股票。
假设您有 1,1,2 这样的股票
因此您的默认股票值为 0,与 while 循环中的 1(第一只股票)相比:
sold1 > sold2 satisfies and with this default becomes 1st stock with value 1
for 循环查找下一只价值为 1 的股票
sold1 == sold2 satisfies and equal becomes true
for 循环查找下一只价值为 2 的股票
sold2 > sold1 satisfies msold remains unchanged
现在看到 equal 为真,所以你输入 else 部分并用语句 as:
打印两次
System.out.println (msold.toSold());
System.out.println (s.toSold());
您可能只打印最大值而不是打印旧值。
我建议使用以下简单代码,它分两个阶段工作:
- 决定
sold
的最大值。
- 它收集具有此值的所有库存项目。
- 它 returns 所有这些库存项目,而不是打印它们。
代码如下:
public List<Stock> getMostSold(Iterable<Stock> stocks) {
int maxSold = Integer.MIN_VALUE;
for (Stock stock : stocks) {
maxSold = Math.max(maxSold, stock.getSold());
}
List<Stock> result = new ArrayList<>();
for (Stock stock : stocks) {
if (stock.getSold() == maxSold) {
result.add(stock);
}
}
return result;
}
一个重要的事情是这个方法没有副作用,也就是说,它不会修改 class 的任何字段或其他东西。因此,您可以随时调用它,并且始终会得到相同的结果。
您可以使用 Comparator
:
private static final Comparator<Stock> COMPARATOR
= new Comparator<Stock>()
{
@Override
public int compare(final Stock o1, final Stock o2)
{
return Integer.compare(o1.getSold(), o2.getSold());
}
};
// and then (NOTE: assumes at least one element, and no null elements)
public Stock mostSold(final List<Stock> list)
{
final int size = list.size();
Stock ret = list.get(0);
for (int i = 1; i < size; i++)
if (COMPARATOR.compare(list.get(i), ret) > 0)
ret = list.get(i);
return ret;
}
如果你使用 Java 8 这更容易:
public Stock mostSold(final List<Stock> list)
{
return list.stream().max(COMPARATOR).get();
}
我想确定 Stock 实例向量中销量最高的产品。
public void mostSold(Vector <Stock> temp){
System.out.println ("Generating Data... Please Wait!");
delay(650);
System.out.println ("-------Most Sold Product(s)-------");
for(int i = 0; i < temp.size(); i ++){
s = temp.elementAt(i); // Stock s = new Stock();
sold1 = s.getSold();
sold2 = msold.getSold(); //Stock msold = new Stock();
if(sold1 > sold2)
msold = s;
else if (sold2 > sold1)
msold = msold;
else if (sold1 == sold2){
equal = true;
}
}
if(!equal)
System.out.println (msold.toSold());
else{
System.out.println (msold.toSold());
System.out.println (s.toSold());
}
System.out.println ();
}
一开始执行的时候效果很好,但是如果我在一次执行中执行2次,控制台会同时输出mostSold和leastSold...!
输出!! 第一次运行:(工作正常)
Generating Data... Please Wait!
-------Most Sold Product(s)-------
Product Name: iphone
Product ID: 0123P
Quantity Sold: 10
Generating Data... Please Wait!
-------Least Sold Product(s)-------
Product Name: nexus
Product ID: 2345P
Quantity Sold: 1
第二次运行:
Generating Data... Please Wait!
-------Most Sold Product(s)-------
Product Name: iphone
Product ID: 0123P
Quantity Sold: 10
Product Name: htc one //WHY IS THIS DISPLAYED!!
Product ID: 3456P
Quantity Sold: 1
Generating Data... Please Wait!
-------Least Sold Product(s)-------
Product Name: nexus
Product ID: 2345P
Quantity Sold: 1
您可能拥有两只价值相等的股票。
假设您有 1,1,2 这样的股票
因此您的默认股票值为 0,与 while 循环中的 1(第一只股票)相比:
sold1 > sold2 satisfies and with this default becomes 1st stock with value 1
for 循环查找下一只价值为 1 的股票
sold1 == sold2 satisfies and equal becomes true
for 循环查找下一只价值为 2 的股票
sold2 > sold1 satisfies msold remains unchanged
现在看到 equal 为真,所以你输入 else 部分并用语句 as:
打印两次 System.out.println (msold.toSold());
System.out.println (s.toSold());
您可能只打印最大值而不是打印旧值。
我建议使用以下简单代码,它分两个阶段工作:
- 决定
sold
的最大值。 - 它收集具有此值的所有库存项目。
- 它 returns 所有这些库存项目,而不是打印它们。
代码如下:
public List<Stock> getMostSold(Iterable<Stock> stocks) {
int maxSold = Integer.MIN_VALUE;
for (Stock stock : stocks) {
maxSold = Math.max(maxSold, stock.getSold());
}
List<Stock> result = new ArrayList<>();
for (Stock stock : stocks) {
if (stock.getSold() == maxSold) {
result.add(stock);
}
}
return result;
}
一个重要的事情是这个方法没有副作用,也就是说,它不会修改 class 的任何字段或其他东西。因此,您可以随时调用它,并且始终会得到相同的结果。
您可以使用 Comparator
:
private static final Comparator<Stock> COMPARATOR
= new Comparator<Stock>()
{
@Override
public int compare(final Stock o1, final Stock o2)
{
return Integer.compare(o1.getSold(), o2.getSold());
}
};
// and then (NOTE: assumes at least one element, and no null elements)
public Stock mostSold(final List<Stock> list)
{
final int size = list.size();
Stock ret = list.get(0);
for (int i = 1; i < size; i++)
if (COMPARATOR.compare(list.get(i), ret) > 0)
ret = list.get(i);
return ret;
}
如果你使用 Java 8 这更容易:
public Stock mostSold(final List<Stock> list)
{
return list.stream().max(COMPARATOR).get();
}