2016-11-14 90 views
0

我要排序的日期和时间,一个ArrayList用户,但出于某种原因进入输出出来不是为了排序的ArrayList中

下面这段代码时使用的代码即时订购

public int compareTo(Vehicle v){ 
    int returnValue = 0; 
    if (this.parkDate.year> v.parkDate.getYear() && 
      this.parkDate.month> v.parkDate.getMonth() && 
      this.parkDate.day> v.parkDate.getDay() && 
      this.parkDate.hours> v.parkDate.getHours() && 
      this.parkDate.minuets> v.parkDate.getMinuets()){ 
     returnValue = 1; } 
    else 
     returnValue = - 1; 
    return returnValue; 
} 

Here is the output message

+1

你真的应该储存日历或Date对象,不是针对每个日期时间部分自己... –

+0

很好的整数,如果一切是相同的,但一分钟时,该语句将返回-1,而不是为1.你需要考虑平等的情况,并且这里有层次结构(如果一个月较少,这与未来一年无关)。你应该使用Java中的可用时间apis(Date,joda time等) – Rogue

回答

2

您的比较逻辑不正确。在非零的情况下,您可以使用Integer.compare(int, int)return进行比较。喜欢的东西,

public int compareTo(Vehicle v) {  
    int returnValue = Integer.compare(this.parkDate.getYear(), 
      v.parkDate.getYear()); 
    if (returnValue != 0) { 
     return returnValue; 
    } 
    returnValue = Integer.compare(this.parkDate.getMonth(), 
      v.parkDate.getMonth()); 
    if (returnValue != 0) { 
     return returnValue; 
    } 
    returnValue = Integer.compare(this.parkDate.getDay(), 
      v.parkDate.getDay()); 
    if (returnValue != 0) { 
     return returnValue; 
    } 
    returnValue = Integer.compare(this.parkDate.getHours(), 
      v.parkDate.getHours()); 
    if (returnValue != 0) { 
     return returnValue; 
    } 
    return Integer.compare(this.parkDate.getMinuets(), 
      v.parkDate.getMinuets()); 
} 

或者,可以缩短上述使用数组和类似

int[] a = { this.parkDate.getYear(), this.parkDate.getMonth(), 
     this.parkDate.getDay(), this.parkDate.getHours(), 
     this.parkDate.getMinuets() }; 
int[] b = { v.parkDate.getYear(), v.parkDate.getMonth(), 
     v.parkDate.getDay(), v.parkDate.getHours(), 
     v.parkDate.getMinuets() }; 
for (int i = 0; i < a.length; i++) { 
    int rv = Integer.compare(a[i], b[i]); 
    if (rv != 0) { 
     return rv; 
    } 
} 
return 0; 

最后,我相信你想分钟小步舞

0

主要问题是您的比较逻辑。您正在测试您的车辆停车日期的年份大于其他车辆的停车日期的年份您的车辆停车日期的月份大于其他车辆的停车日期的月份同上一天,小时和分钟。这是不正确的。

考虑2016-01-01 00:002015-12-31 23:59。前者明确为后者,但其月,日,时,分均为,小于等。因此,在这种情况下,您的逻辑将无法产生正确的结果。

更合适的方法是:

  • 比较岁:如果他们是不同的,你可以返回一个结果,即。小于或大于
  • 如果它们相同,则比较月份;如果他们不同,你可以返回结果
  • 如果他们是相同的,比较天;如果他们不同,你可以返回结果
  • 如果他们是相同的,比较小时;如果它们不同,则可以返回结果
  • 如果它们相同,则比较分钟;如果他们是不同的,你可以返回结果
  • ,如果它们是相同的,注明日期是相等的

(此外,请务必记得implement ComparableVehicle类)。

+0

是的我已经完成了Implement Comparable,并且得到你所说的并且试图改变它,但它只是出现了错误有没有什么可以建议 –

+0

@AlexBurrows我用伪代码解决方案更新了我的答案。 – dave

0

原因是因为你的布尔逻辑有错误。

if (this.parkDate.year> v.parkDate.getYear() && 
     this.parkDate.month> v.parkDate.getMonth() && 
     this.parkDate.day> v.parkDate.getDay() && 
     this.parkDate.hours> v.parkDate.getHours() && 
     this.parkDate.minuets> v.parkDate.getMinuets()){ 
    returnValue = 1; } 
else 
    returnValue = - 1; 

否则,就像是把你的if声明negation。在这种情况下等同于以下情况:

this.parkDate.year <= v.parkDate.getYear() 

OR

this.parkDate.month <= v.parkDate.getMonth() 

OR

this.parkDate.day> v.parkDate.getDay() 
... 

换句话说

Negation(A && B) <=> (Negation(A) || Negation(B)) 

在您的情况下,你的else逻辑可以即使年份大于this.parkDate

我认为这应该足以帮助您做到正确。:)

0

我认为你可以使用“的compareTo”的结果是0,1,-1

public int compareTo(Vehicle a, Vehicle b){ 
    return a.parkDate.compareTo(b.parkDate); 
} 
0

不是存储日期和时间为基元,您可以创建一个LocalDateTimeComparator

使用

Vehicle类添加字段parkDateLocalDateTime

LocalDateTime parkDate = LocalDateTime.of(year, month, dayOfMonth, hour, minute, second); 

使用parkDatecompareTo方法

@Override 
public int compareTo(Vehicle o) {  
    return this.parkDate.compareTo(o.parkDate); 
}