java - 使用另一个数组计算一个数组中的重复项无法执行 (Java)

标签 java arrays

有 2 个小时完成我的作业,我被困在最后一个方法上,这对我来说似乎是正确的,但调试器无法执行它。

在下面的方法(getPopularLine)中,我需要找到一个最“流行”的公共(public)汽车号码(我们在我的国家称之为线路号码)(基本上我需要返回出现在该位置的 BusArrival 对象的 lineNumber _buses 数组中的大部分(重复项))。

为了让我的问题更清楚,我正在使用 BlueJ,每当我尝试运行调试器时,它只会说“虚拟机正在执行......”,但它永远不会执行。其他一切都运行良好,我没有收到任何错误,它表示语法很好。

这是我想出的代码:

public class BusStop
{
  private BusArrival[] _buses;
  private int _noOfBuses;
  final int MAX_ARRAY_SIZE = 1000;

  //================================ CONSTRUCTORS ============================//

    public BusStop(){
      _buses = new BusArrival[MAX_ARRAY_SIZE];
      _noOfBuses = 0;
     }


    public BusStop(int size){       
        _buses = new BusArrival[size];  
        _noOfBuses = 0;             
    }
  //=============================== METHODS =================================//
public int getPopularLine(){
    int[] busLine = new int[100];
    int popularLine = 0;

    for(int i = 1; i <= busLine.length; i++){ //bus numbers are between 1 and 99.
        for (int j = 0; j <_buses.length; i++){
            if(_buses[j] == null){
                continue;
            }
            if(i == _buses[j].getLineNum()){ //getLineNum() method returns the bus number of a bus(BusArrival object).
                busLine[i]++;
            }
        }
    }

    for(int i = 1; i <= busLine.length; i++){
        for(int j = 1; j <= busLine.length; j++){
            if(busLine[i] > busLine[j]){
                popularLine = i;
            }
            else{
                break;
            }
        }
    }

    return popularLine;
}

public boolean add (int line, int pass, Time1 t){
    for (int i=0; i < _buses.length; i++){
        if(_buses[i] == null){
            _buses[i] = new BusArrival(line, pass, t);
            return true;
        }

    }

    return false;

}

这是我的主要方法:

public class Test
{
  public static void main (String [] args){
      BusStop first = new BusStop(4);
      Time1 one = new Time1(10,30,0);
      Time1 two = new Time1(10,0,0);
      Time1 three = new Time1(9,40,0);
      first.add(1,2,two);
      first.add(1,4,two);
      first.add(2,4,three);
      System.out.println(first.getPopularLine());
    }
}

以下 2 个构造函数可能不相关,但我发布它们只是为了让事情变得有意义。

这是 BusArrival 类的构造函数(:

public BusArrival(int lineNum, int pass, int h, int m, int s){

    _lineNumber = lineNum;
    _noOfPassengers = pass;
    _arrivalTime = new Time1(h, m, s);

}

这是 Time1 类的构造函数:

public Time1(int h, int m, int s)
{

    _hour = h;
    _minute = m;
    _second = s;

}

如有任何帮助,我们将不胜感激。

最佳答案

有一些 Java 约定值得尊重。

第一步

我已将您的 Time1 类重命名为 ArrivalTime 并删除了代表 seconds 的变量/属性/参数,因为 Java 喜欢现实的方法。我也重命名了您的参数和属性名称,就像“Java-drinkers ”通常所做的那样:

public class ArrivalTime {
    private final int hours;
    private final int minutes;

    public ArrivalTime(int hours, int minutes) {
        this.hours = hours;
        this.minutes = minutes;
    }
}

第二步

我对你的 BusArrival 类做了同样的事情

public class BusArrival {

    private final int lineNumber;
    private final int passengerCount;
    private final ArrivalTime arrivalTime;

    public BusArrival(int lineNumber, int passengerCount, int hours, int minutes) {
        this(lineNumber, passengerCount, new ArrivalTime(hours, minutes));
    }

    public BusArrival(int lineNumber, int passengerCount, ArrivalTime arrivalTime) {
        this.lineNumber = lineNumber;
        this.passengerCount = passengerCount;
        this.arrivalTime = arrivalTime;
    }

    public int getLineNumber() {
        return lineNumber;
    }
}

第三步

我几乎完全改变了你的 BusStop 类。

  • 尝试使用 <editor-fold> 而不是丑陋的长注释 (特别是对于 NetBeans;查找更多 @ How to quickly create editor fold? )
  • BusStop 类有一个属性 Map<Integer, Set<BusArrival>> busArrivals ,这意味着它成为一种通用 LinkedHashMap 增强,其中 Integer -keys 表示行号(总线号),并且每个键都有一个唯一的 Set 的集合(通用 BusArrival )附上s。
  • 作为对此“自定义 LinkedHashMap ”的增强,我已将您的 add 函数替换为您向类添加条目所需的函数。
  • 我在您的 Lambda 函数中使用了 getPopularLine(),这使得计算更快、更容易,并且视觉上更丰富。使用 reduce 方法,我“要求”Lambda 先生从我的 LinkedHashMap 中只给我一个键 (= lineNumber),该键指向大多数 BusArrivals。
  • 使用私有(private)(WriteOnly)属性max,我防止添加比预定义更多的公交车线路(不是到达;如果您需要防止添加更多到达数量超过BusArrivals总数,请将函数getTotalArrivals()(参见我的帖子底部)添加到您的 BusStop 类,并将 if (busArrivals.size() < max) 函数内的 add(BusArrival busArrival) 替换为 if (getTotalArrivals() < max)

所以,

import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.Map;
import java.util.Set;

public class BusStop {
    private final Map<Integer, Set<BusArrival>> busArrivals;
    private final int max;

    public BusStop(final int max) {
        busArrivals = new LinkedHashMap<>();
        this.max = max;
    }

    public Map<Integer, Set<BusArrival>> getBusArrivals() {
        return busArrivals;
    }

    //<editor-fold defaultstate="collapsed" desc="Engine Enhancement">
    public int getPopularLine() {
        return busArrivals.keySet().stream().reduce(0, (previous, current)
                -> (busArrivals.keySet().contains(previous) && busArrivals.get(previous).size() > busArrivals.get(current).size())
                ? previous
                : current);
    }

    public boolean add(BusArrival busArrival) {
        if (busArrivals.size() < max) {
            Set<BusArrival> arrivals = busArrivals.get(busArrival.getLineNumber());
            if (arrivals == null) {
                arrivals = new LinkedHashSet<>();
            }
            arrivals.add(busArrival);
            busArrivals.put(busArrival.getLineNumber(), arrivals);
            return true;
        }
        return false;
    }
    //</editor-fold>
}

第四步

当然,我也更改了你的 main 静态函数:

public class Test {
    public static void main(String[] args) {
        BusStop first = new BusStop(4);
        first.add(new BusArrival(1, 2, new ArrivalTime(10, 30)));
        first.add(new BusArrival(1, 4, new ArrivalTime(10, 0)));
        first.add(new BusArrival(2, 4, new ArrivalTime(9, 40)));
        System.out.println(first.getPopularLine());
    }
}

BusStop 类的额外方法

getTotalArrivals()方法:

public int getTotalArrivals() {
    return busArrivals.values().stream().mapToInt(value -> value.size()).reduce(0, Integer::sum);
}

最后

希望能帮到你。

关于java - 使用另一个数组计算一个数组中的重复项无法执行 (Java),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34244992/

相关文章:

c++ - Arduino 数组和 if 语句

c - 将数组展平为字符串

java - 在eclipse中重命名多个文件

java - 如何在graphstream中使用静态布局

java - JBoss 在展开的部署目录上重新部署更改

java - 无法在 for-each 循环中写入 "i+2"作为后置条件 [Java]

javascript - 检查对象中是否只有一个数组有值

java - Jpanel 未出现在 Safari 中

java - 使用 HQL 管理序列

PHP MySQL 查询数组帮助