有 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/