如何使用java对twitter推文进行排序

时间:2014-10-15 08:31:25

标签: java twitter

我有这段代码:

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中添加屏幕名称时,我只能对屏幕名称进行排序,当我想打印出按屏幕名称排序的推文时,它会给我错误的答案,因为推文的其余部分(文本和日期)没有按屏幕名称排序。

如何按

排序推文
  • 屏幕名
  • 日期
  • 和文字

(上升和下降)和打印出正确的作者,日期和文本的分类推文基本上是我要问的?

2 个答案:

答案 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}
]