【问题标题】:Sort List of Object and find empty slot in Java [duplicate]对对象列表进行排序并在Java中找到空槽[重复]
【发布时间】:2018-05-12 19:06:47
【问题描述】:

我正在用 Java 编写一个应用程序,我想在其中显示商店的完整时间表以及人何时进出以及何时无人。请查看附图。

人员列表在 JSON 文件中:

{
  "venue": {
    "id": 123456,
    "name": "Foursquare HQ",
    "openTime": 1479798000000,
    "closeTime": 1479864600000,
    "visitors": [
      {
        "id": 1,
        "name": "Dave",
        "arriveTime": 1479805200000,
        "leaveTime": 1479816000000
      },
      {
        "id": 2,
        "name": "Elizabeth",
        "arriveTime": 1479801600000,
        "leaveTime": 1479819600000
      },
      {
        "id": 3,
        "name": "Ben",
        "arriveTime": 1479826800000,
        "leaveTime": 1479830400000
      },...

这个 json 被提取出来,可以通过一个叫做 getVisitors 的方法访问,它返回一个 List。 Person 类声明如下:

public final class Person{
    private int id;
    private String name;
    private long arriveTime;
    private long leaveTime;

    public Person(int id, String name, long arriveTime, long leaveTime){
        this.id = id;
        this.name = name;
        this.arriveTime = arriveTime;
        this.leaveTime = leaveTime;
    }

    public int getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public long getArriveTime() {
        return arriveTime;
    }

    public long getLeaveTime() {
        return leaveTime;
    }
}

我正在寻找一种方法来首先按升序对 getVisitor 返回的列表进行排序,以便从第一个到最后一个。我在考虑使用到达时间并使用

Collections.sort(list, new Comparable()...)

问题是我需要重写 compareTo 方法,但它被拒绝了,因为 compareTo 返回整数并且我的到达时间很长。

我的另一个问题是如何添加“无访客”项目?第一个和最后一个可以使用

添加
list.add(idx, element)

但我没有看到一个简单的算法可以在白天找到访客之间的空位。

我正在使用 RecycledView 将信息显示为列表,如下所示:

public class MainActivity extends AppCompatActivity {

    private static final String TAG = MainActivity.class.getSimpleName();

    private RecyclerView rvRecyclerView;
    private static PersonAdapter personAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        rvRecyclerView = findViewById(R.id.rvRecyclerView);
        rvRecyclerView.setLayoutManager(new LinearLayoutManager(this));


        if(personAdapter == null)
            personAdapter = new PersonAdapter();

        //set the adapter of the recycler view to push data.
        rvRecyclerView.setAdapter(personAdapter);

        Log.d(TAG, "ON CREATE CALL");
        new VenueFetcher(this).execute();
    }

VenueFetch 是一个 AsyncTask,负责从 json 文件中提取 json 并使用对

的调用
        mainActivity.personAdapter.notifyDataSetChanged();

更新部分工作的列表

这不是重复的,因为我也在时间范围内寻找空槽。根据访客列表和商店的开/关时间,我需要找到没有访客的所有时段

有什么想法吗?

【问题讨论】:

  • 您能否添加 compareTo() 方法的代码。您是如何覆盖该方法的?要进行排序,您需要在用户类中实现可比较并需要比较到达时间。然后您可以使用 Collections.sort(list); 简单地按到达时间对列表进行排序;
  • 每个问题一个问题!

标签: java list sorting


【解决方案1】:

compareTo 将仅返回 1 或 -1 或 0 以指示是否具有可比性 交换或不交换所以我认为不存在可比性的问题。 可能问题出在其他地方。

你可以纠正我或者再看看你的逻辑。

在可比较函数中返回正数(1)而不是实数和负数(-1)

public int compareTo(O o){ 
 if(o.long>long){
  return 1// instead of long number
 }
 else if(o.long<long){
 return -1 // instead of long number
 }
 else(return 0)// instead of long number
}

我认为这会有所帮助

【讨论】:

  • 不,Comparator.naturalOrder() 是正确的做法。
  • 好的,谢谢,我不知道。但你能说出这种方式有什么问题吗?这会更有帮助。
  • @JarrodRoberson 我知道我的问题是重复的,但没有一个重复显示在我的 List 上使用 Comparator.naturalOrder() 的示例。有一个例子会很棒
  • @RajanLagah 谢谢,您的解决方案运行良好。我已经对其进行了一点定制并在对象类中实现
  • 万岁!!很高兴我能帮助你
猜你喜欢
  • 2014-12-26
  • 2012-10-14
  • 2018-10-20
  • 1970-01-01
  • 1970-01-01
  • 2016-10-14
  • 2016-03-21
  • 1970-01-01
  • 2011-07-07
相关资源
最近更新 更多