我有这段代码:
for (Status tweet : tweets) {
y++;
users.add(new twitterTweets(tweet.getUser().getScreenName(), tweet.getText(), tweet.getCreatedAt()));
System.out.println(y + ": - " + "@" + tweet.getUser().getScreenName()
+ " - " + tweet.getText() + " - " + tweet.getCreatedAt());
i++;
}
Collections.sort(users, String.CASE_INSENSITIVE_ORDER);
int a= 0;
for(String temp : users) {
a++;
System.out.println(temp);
}
我想打印出按日期排序的推文(升序,降序和排序是CASE_INSENSITIVE),我还想打印出按屏幕名称和文字排序的推文。我知道我可以使用Collections.sort
,但这并不能解决我的问题,因为当我在ArrayList
中添加屏幕名称时,我只能对屏幕名称进行排序,当我想打印出按屏幕名称排序的推文时,它会给我错误的答案,因为推文的其余部分(文本和日期)没有按屏幕名称排序。
如何按
排序推文(上升和下降)和打印出正确的作者,日期和文本的分类推文基本上是我要问的?
答案 0 :(得分:1)
您必须将Comparator
作为第二个参数传递给Collections.sort()
。
示例:强>
你有Person
课程:
public class Person {
private final String firstName;
private final String lastName;
public Person(final String firstName, final String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
public String getFirstName() {return this.firstName;}
public String getLastName() {return this.lastName;}
@Override
public String toString() {
return this.firstName + " " + this.lastName;
}
}
现在您可以对Collection
这样的Person
进行排序:
public class Main {
public static void main(String[] args) {
final List<Person> persons = new LinkedList<>();
persons.add(new Person("Albert", "Einstein"));
persons.add(new Person("James", "Bond"));
// sort by lastname, ascending
Collections.sort(persons, (p1, p2) -> p1.getLastName().toUpper().compareTo(p2.getLastName().toUpper()));
persons.forEach(System.out::println);
}
}
<强>输出:强>
James Bond
Albert Einstein
对于其他排序顺序,请使用其他字段:
// firstname, ascending
(p1, p2) -> p1.getFirstName().toUpper().compareTo(p2.getFirstName().toUpper());
// ^ here is now getFirstName()
或对于相反的顺序,切换对象:
// lastname, descending
(p1, p2) -> p2.getLastName().toUpper().compareTo(p1.getLastName().toUpper());
// ^ here is now p2 ^ here is now p1
// firstname, descending
(p1, p2) -> p2.getFirstName().toUpper().compareTo(p1.getFirstName().toUpper());
// ^ here is now p2 ^ here is now p1
答案 1 :(得分:0)
accepted answer by ifLoop是正确,完整和出色的。我碰巧有这个完整的单文件示例显示使用Comparator按日期时间进行排序,所以我想我也会发布它。
我添加了Joda-Time DateTime
的使用,因为java.util.Date
可能会非常麻烦。我建议避免使用.Date / .Calendar类来支持Joda-Time或Java 8中的新java.time package(受Joda-Time启发)。但这既不是在这里也不是在那里。此示例显示.Date和DateTime。
Joda-Time的默认字符串输出采用标准ISO 8601格式。这种格式对于java.util.Date的toString
格式错误的格式生成的输出非常有用,而且JVM的当前默认时区容易混淆。
package com.example.jodatimeexperiment;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
public class Tweet
{
public String name;
public Date date;
public DateTime dateTime;
public Tweet( String name , DateTime dateTime )
{
this.name = name;
this.dateTime = dateTime;
this.date = this.dateTime.toDate();
}
@Override
public String toString()
{
return "Tweet{" + "dateTime=" + dateTime + ", date=" + date + ", name=" + name + '}' + "\n";
}
public static void main( String[] args )
{
List<Tweet> list = new ArrayList<Tweet>( 4 );
list.add( new Tweet( "Bob" , DateTime.now( DateTimeZone.UTC ) ) );
list.add( new Tweet( "Pierre" , DateTime.now( DateTimeZone.UTC ).plusDays( 5 ) ) );
list.add( new Tweet( "Sanjay" , DateTime.now( DateTimeZone.UTC ).withYear( 1999 ) ) );
list.add( new Tweet( "Susan" , DateTime.now( DateTimeZone.UTC ).minusDays( 4 ) ) );
System.out.println( "Unsorted:\n" + list.toString() );
Collections.sort( list , new DateAscendingComparator() );
System.out.println( "Sorted By Date Ascending:\n" + list.toString() );
Collections.sort( list , new DateTimeAscendingComparator() );
System.out.println( "Sorted By DateTime Ascending:\n" + list.toString() );
Collections.sort( list , new DateTimeDescendingComparator() );
System.out.println( "Sorted By DateTime Descending:\n" + list.toString() );
}
}
class DateAscendingComparator implements Comparator<Tweet>
{
@Override
public int compare( Tweet o1 , Tweet o2 )
{
return o1.date.compareTo( o2.date );
}
}
class DateTimeAscendingComparator implements Comparator<Tweet>
{
@Override
public int compare( Tweet o1 , Tweet o2 )
{
return o1.dateTime.compareTo( o2.dateTime );
}
}
class DateTimeDescendingComparator implements Comparator<Tweet>
{
@Override
public int compare( Tweet o1 , Tweet o2 )
{
return o2.dateTime.compareTo( o1.dateTime ); // Reversed order for descending.
}
}
跑步时。
Unsorted:
[Tweet{dateTime=2014-10-21T19:00:21.224Z, date=Tue Oct 21 12:00:21 PDT 2014, name=Bob}
, Tweet{dateTime=2014-10-26T19:00:21.257Z, date=Sun Oct 26 12:00:21 PDT 2014, name=Pierre}
, Tweet{dateTime=1999-10-21T19:00:21.257Z, date=Thu Oct 21 12:00:21 PDT 1999, name=Sanjay}
, Tweet{dateTime=2014-10-17T19:00:21.257Z, date=Fri Oct 17 12:00:21 PDT 2014, name=Susan}
]
Sorted By Date Ascending:
[Tweet{dateTime=1999-10-21T19:00:21.257Z, date=Thu Oct 21 12:00:21 PDT 1999, name=Sanjay}
, Tweet{dateTime=2014-10-17T19:00:21.257Z, date=Fri Oct 17 12:00:21 PDT 2014, name=Susan}
, Tweet{dateTime=2014-10-21T19:00:21.224Z, date=Tue Oct 21 12:00:21 PDT 2014, name=Bob}
, Tweet{dateTime=2014-10-26T19:00:21.257Z, date=Sun Oct 26 12:00:21 PDT 2014, name=Pierre}
]
Sorted By DateTime Ascending:
[Tweet{dateTime=1999-10-21T19:00:21.257Z, date=Thu Oct 21 12:00:21 PDT 1999, name=Sanjay}
, Tweet{dateTime=2014-10-17T19:00:21.257Z, date=Fri Oct 17 12:00:21 PDT 2014, name=Susan}
, Tweet{dateTime=2014-10-21T19:00:21.224Z, date=Tue Oct 21 12:00:21 PDT 2014, name=Bob}
, Tweet{dateTime=2014-10-26T19:00:21.257Z, date=Sun Oct 26 12:00:21 PDT 2014, name=Pierre}
]
Sorted By DateTime Descending:
[Tweet{dateTime=2014-10-26T19:00:21.257Z, date=Sun Oct 26 12:00:21 PDT 2014, name=Pierre}
, Tweet{dateTime=2014-10-21T19:00:21.224Z, date=Tue Oct 21 12:00:21 PDT 2014, name=Bob}
, Tweet{dateTime=2014-10-17T19:00:21.257Z, date=Fri Oct 17 12:00:21 PDT 2014, name=Susan}
, Tweet{dateTime=1999-10-21T19:00:21.257Z, date=Thu Oct 21 12:00:21 PDT 1999, name=Sanjay}
]