从Java集中获取* any *值的好方法?

时间:2012-12-03 22:13:01

标签: java set any

给定一个简单的Set<T>,从Set获取任何值的好方法(快速,几行代码)是什么?

使用List,很容易:

List<T> things = ...;
return things.get(0);

但是,使用Set时,没有.get(...)方法,因为Set未被排序。

3 个答案:

答案 0 :(得分:68)

Set<T>Iterable<T>,因此迭代到第一个元素有效:

Set<T> things = ...;
return things.iterator().next();

Guava有a method来执行此操作,但上面的代码段为is likely better

答案 1 :(得分:4)

由于存在流,您也可以这样做,但您必须使用类java.util.OptionalOptional是元素的包装类或显式无元素(避免使用Nullpointer)。

//returns an Optional.
Optional <T> optT = set.stream().findAny();

//Optional.isPresent() yields false, if set was empty, avoiding NullpointerException
if(optT.isPresent()){
    //Optional.get() returns the actual element
    return optT.get();
}

答案 2 :(得分:1)

从集合或集合中获取任何元素可能看起来像一个不常见的需求 - 如果不是任意的或兼收并蓄的 - 但是,例如,当一个人需要计算统计数据时,它是很常见的在Map中的Keys或Values对象上,必须初始化最小/最大值。 Set / Collection中的任何元素(由Map.keySet()或Map.values()返回)将用于此初始化,然后在每个上更新最小值/最大值 element。

那么,在遇到这个问题时会有什么选择,同时又会尝试将内存和执行时间保持在较小并且代码清晰?

通常你会得到通常的结果:“将Set转换为ArrayList并获取第一个元素”。大!从Set,分配数组中检索对象的数百万项和额外处理周期的另一个数组,填充它:

HashMap<K,V> map;
List<K> list = new ArrayList<V>(map.keySet()); // min/max of keys
min = max = list.get(0).some_property(); // initialisation step
for(i=list.size();i-->1;){
 if( min > list.get(i).some_property() ){ ... }
 ...
}

或者可以使用Iterator循环,使用标志表示需要初始化min / max,并使用条件语句检查是否为循环中的所有迭代设置了该标志。这意味着需要进行大量的条件检查。

boolean flag = true;
Iterator it = map.keySet().iterator();
while( it.hasNext() ){
  if( flag ){
    // initialisation step
    min = max = it.next().some_property();
    flag = false;
  } else {
    if( min > list.get(i).some_property() ){ min = list.get(i).some_property() }
  ...
  }
}

或者在循环外进行初始化:

HashMap<K,V> map;
Iterator it = map.keySet().iterator();
K akey;
if( it.hasNext() ){
  // initialisation step:
  akey = it.next();
  min = max = akey.value();
  do {
    if( min > list.get(i).some_property() ){ min = akey.some_property() }
  } while( it.hasNext() && ((akey=it.next())!=null) );
}

但是,当需要min / max时,代表程序员(以及代表JVM设置Iterator)真的值得所有这些吗?

来自javally-correct ol'运动的建议很可能是:“将地图包装在一个类中,该类在放置或删除时跟踪最小值和最大值!”。

还有另一种情况根据我的经验,我们需要从地图中任何项目。 这是当地图包含具有公共属性的对象时 - 对于该地图中的所有对象都是相同的 - 并且您需要读取该属性。例如,假设存在具有相同直方图的具有相同维数的保持箱的地图。鉴于这样的地图,您可能需要知道地图中任何 Histobin的维度数量,以便创建具有相同尺寸的另一个Histobin。我是否需要再次设置迭代器并在调用next()一次后将其处理掉?对于这种情况,我会跳过一个正确的人的建议。

如果获取任何元素的所有麻烦导致无意义的内存和cpu周期增加,那么为了获得难以获得的,必须编写的所有代码呢?任何元素。

我们需要任何元素。把它给我们!

相关问题