什么会更好的设置,数组或列表?

时间:2012-01-05 19:42:10

标签: java arrays list set

我需要列出一个人和他们到达聚会的时间列表,当他们离开时我需要将他们从这个列表中删除。 (党的最高人数是150)

Set会告诉我,在任何情况下我都不会两次添加同一个人。
列表将为我提供灵活性,以很少的空格开始列表(如果没有人出现)。
阵列(不确定它们提供的是什么)但我经常使用它们。

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

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

或许我太复杂了?

6 个答案:

答案 0 :(得分:5)

地图实施:

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;

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

除非您有使用基于List [或类似]的数据结构的绑定。

答案 3 :(得分:1)

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

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);
     }
}

答案 4 :(得分:0)

我认为你也可以使用数组,而是使用两个数组,使用一个'Person'模型数组,它包含人名,到达时间和离开时间。在数组上插入之前,您可以验证列表是否已包含此人。

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

答案 5 :(得分:0)

LinkedHashMap - 一个键值对的容器,用于维护其插入顺序。关键是人(简单的String或指定的类),价值是到达时间,例如Date