【问题标题】:Loop through array and display only one item循环遍历数组并仅显示一项
【发布时间】:2013-12-26 21:11:28
【问题描述】:

我有一个如下所示的数组:

  array = { Person1, Person2, Person3, Person1, Person2, Person3};

现在我怎样才能得到一个包含唯一人员总数的 int?这意味着一个已经被计算过的人不应该被再次计算。

在上面给出的例子中应该返回 3 的 int 值

  int uniq = 3;

我怎样才能完成这项任务?

【问题讨论】:

  • 在我们回答之前,你怎么知道“人”是平等的?它们是相同的参考吗(所以array[0] == array[3] 在上面的例子中是真的)?或者您是否为您的Person 类重新定义了equals?还是用其他方法来检验两个人是否相同?
  • 所有相同编号的人具有相同的值

标签: java android


【解决方案1】:

如果你想要的只是大小,这是其他答案之一的正确版本:

Set<Person> set = new HashSet<Person>(Arrays.asList(array));
int count = set.size();

这假定您的Person 类型有一个equals 方法可以告诉您两个人是否相同,或者如果没有equals,则默认equals 是可以的(默认返回@987654327 @ 如果引用相等)。

P.S.:如果您在 equals 中定义了自己的 Person,则您必须还定义 hashCode,否则此解决方案将不起作用。必须定义hashCode,以便如果两个Persons 相等,那么它们也具有相同的哈希码。见What issues should be considered when overriding equals and hashCode in Java?

【讨论】:

    【解决方案2】:

    最简单的方法是在数组中添加人员时避免使用 doublon。 为此,当您在数组中添加一个 Person 时,您会遍历所有数组并确认您还没有它:)

    如果您需要在列表中包含 doublon,那么您应该创建一个 tempArray,并且只在这个新数组中添加不同的人,就像在其他方法中描述的那样,所以最后您将在 tempArray 中获得好数字.size()

    【讨论】:

    • 或者只使用一个集合。每次检查一个对象是否已经在一个数组中可能会很昂贵。
    • 我其实不知道 Brianjs 的方法,但那比我的好 ^^ 但真正的问题是为什么他必须在他的列表中包含 doublon ^^
    • 我得到一个有名字的数组,但我只想显示有多少不同的名字作为一个数字
    • 是的,我明白这一点,但你有没有用双倍的?或者这只是一种痛苦,在这种情况下,你应该避免从一开始就加倍 :) 至少这是我的看法^^
    【解决方案3】:

    试试:

    List<Person> uniqueList = new ArrayList<Person>(new LinkedHashSet<Person>( array.asList() ).sort() );
    
    uniqueList.size(); //Number of unique objects
    

    【讨论】:

    • (1) LinkedHashSet 没有 sort 方法; (2) 如果元素类型不是Comparable,你甚至不能做sort,我们不知道元素类型是否定义了排序函数; (3) 如果他想要的只是大小,那么sort 无论如何都毫无意义。
    • (4) 我第一次错过了这个:数组没有asList 方法。正确的调用是Arrays.asList(array)
    猜你喜欢
    • 2017-05-21
    • 2023-03-19
    • 1970-01-01
    • 2018-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多