【问题标题】:How to use Stream, to write an efficient shuffling method如何使用Stream,写一个高效的shuffle方法
【发布时间】:2020-08-31 10:21:36
【问题描述】:

我有一个 ArrayListResidence 对象。每个Residence 对象都有两个字段type::Stringprice::BigInteger。我想知道是否有一种有效的方法来重组列表,因此没有具有相同nameResidence 对象彼此相邻。目标是编写一个高效的洗牌方法。

【问题讨论】:

  • 这不是洗牌。你不会说一副牌洗得很干净,因为没有同花色的牌并排在一起。随机播放意味着随机性。随机性并不关心在人类看来什么比其他东西“更随机”
  • 另外,这种算法应该如何解释例如所有名称都相同的情况?没有可能的结果。
  • 假设可用的数据有足够多的名称

标签: java-8 functional-programming java-stream


【解决方案1】:

我建议您使用HashMap<String, Stack<Residence>> 并为每种类型保存相应的元素。 然后以循环方式循环 hashmap 通过键并​​从堆栈中弹出项目。您获得的每个项目,您都可以将其添加到新列表中。 假设您的 ArrayList of Residence 是residences,代码应该是这样的(未测试,仅用于展示算法):

HashMap<String, Stak<Residence>> hm;
ArrayList<Residence> resultList = new ArrayList();

for (Residence r : residences) {              
    hm.put(r.type, r);
}

boolean exist = true;
while(exist) {
    exist = false;
    for(Map.Entry m : hm.entrySet()){    
        if(!m.getValue().isEmpty()) {
            exist = true;
            resultList.add(m.getValue().pop());
        }      
    }  
}

【讨论】:

  • 谢谢!这实际上很有帮助。是否可以修改它,以便从每个 Stack 中返回价格值最低的 Residence 对象?
  • @Dc235 是的,可以修改算法以始终返回最低价格的Residence。您可以用优先队列替换堆栈,优先级应该是价格值。不客气。
猜你喜欢
  • 1970-01-01
  • 2020-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-29
相关资源
最近更新 更多