【问题标题】:What would be better set, array or list?什么会更好的设置,数组或列表?
【发布时间】:2012-01-05 19:42:10
【问题描述】:

我需要列出人员名单以及他们到达派对的时间,当他们离开时,我需要将他们从这份名单中删除。 (聚会人数上限为 150)

Set 会告诉我,在任何情况下我都不会添加同一个人两次。
List 可以让我灵活地以很少的空格开始列表(以防没有人出现)。
数组(不确定它们提供什么),但我更经常使用它们。

我的想法是要么创建 2 个数组,一个包含名称,一个包含时间。当有人进来时,我将名字保存在一个,时间保存在另一个。当他/她离开时,我搜索他/她的名字,将其删除并使用相同的索引删除另一个数组上的时间。

一个列表可以有一个包含 2 个元素的数组,然后我只需要将它添加到一个位置,但搜索会稍微复杂一些。

或者是我把事情复杂化了?

【问题讨论】:

  • 一张以人为键,以时间为值的地图怎么样?
  • 你不需要 2 个数组;你也可以有一个对象 Person { time, name } 的数组
  • 您要对数据进行哪些操作?输入是什么样的?
  • 我怀疑由于您要处理 150 条记录,因此在设置中增加复杂性不会给您带来太多收益。如果我们谈论数千,也许。那么排序列表呢?搜索会非常快,即使再一次为 150 条记录付出了很多努力。
  • 不,这不是家庭作业,实际上也不是关于人们参加聚会的,但我认为这样解释更容易一些。回想起来,我认为这个问题可能有点愚蠢,但仍然有很好的答案值得思考。

标签: java arrays list set


【解决方案1】:

地图实现:

public final class Person
{
  ... remainder left to the student ...
}

Map<Person, Date> currentPartyAttendees; // date is arrival time.

设置实现:

public final class PartyAttendee
{
  ... person details ...
  Date arrive;

  int hashcode()
  {
    ... use Apache HashCodeBuilder ... 
  }

  boolean equals(Object other)
  {
    ... implementation left to student.  Use Apache EqualsBuilder ...
  }
}

Set<PartyAttendee> currentPartyAttendees;

【讨论】:

    【解决方案2】:

    使用 HasMap 将适合您的目的,因为您可以使用人员的姓名作为键来添加和检索人员的条目,并且它提供恒定的时间性能,因此无论集合增长多大,性能都应该保持一致。

    【讨论】:

      【解决方案3】:

      按照您描述用例的方式,为什么不考虑HashMap 或其他基于Map 的实现?

      当然,除非有一个绑定供您使用基于 List [或类似] 的数据结构。

      【讨论】:

        【解决方案4】:

        只需使用一个 List 和一个代表来宾的数据结构。 子类列表来标记到达和离开时间和添加/删除方法。您也可以使用 set,但是您必须生成 hashCode 和 equals 方法。我不确定你想这样做,因为人们可能有相同的名字(除非你有其他数据,如 SSN、生日、中间名等)

        public Class Guest{
           private String firstName, lastName;
           private long arrivalTime, departureTime;
           ....
        }
        
        public class MyGuests extends ArrayList<Guest>{
             @Overide
             public void add(Guest g){
             //record arrival time here
                  super.add(g)
             }
             @Overide
             public void remove(Guest g){
             //record departure time here
                  super.remove(g);
             }
        }
        

        【讨论】:

          【解决方案5】:

          我认为您也可以使用数组,而不是两个数组,而是使用“Person”模型的数组,其中包含人的姓名、到达时间和离开时间。在插入数组之前,您可以验证列表是否已包含此人。

          ps:不要忘记覆盖模型中的 equals() 和 hashCode()

          【讨论】:

            【解决方案6】:

            LinkedHashMap - 保持插入顺序的键值对容器。键是人(简单的String 或指定的类),值是到达时间,例如Date。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2019-06-14
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2016-05-09
              • 1970-01-01
              相关资源
              最近更新 更多