选择类X的ArrayList的不同字段

时间:2019-04-17 09:40:37

标签: java performance arraylist

我有一个X类的ArrayList。

ArrayList<X> items = new ArrayList();

类X包含多个字段,所有字段都是类型字符串。 (ID,说明,品牌...)

那么,如果我想获得仅包含给定字段不同值的此类的ArrayList,该怎么办?

在实践中:

如何获取包含所有品牌但没有重复的X类的ArrayList? (获得items中的所有品牌,但两次均没有品牌)

或者有没有更好/更有效的方法来仅获取品牌列表?

\ e:我不使用Java8。

希望这不太令人困惑。

3 个答案:

答案 0 :(得分:1)

 items.stream()
            .collect(Collectors.groupingBy(X::getBrand))   // group your items by brand
            .values().stream()                            // stream map values
            .map(e->e.get(0))                            // for each brand get first element in brand list 
            .collect(Collectors.toList());

如果您不能使用java8 /流

    Map<String,List<X>> map = new HashMap<>();
    for(X item : items){
        if(!map.containsKey(item.getBrand())){
            map.put(item.getBrand(), new ArrayList<>());
        }else{
            map.get(item.getBrand()).add(item);
        }
    }
    List<X> result = new ArrayList<>();
    for(Map.Entry<String,List<X>> e : map.entrySet()){
        result.add(e.getValue().get(0));
    }

答案 1 :(得分:0)

使用java.util.Set,根据定义,该值不允许重复的值。

Set<String> s = new HashSet<>();
for(X x : items) {
    s.add(x.getField());
}

// "s" now contains all distinct "field"

应该有使用lambda和流的此代码的版本。但是IMO这样简单的代码并不需要

答案 2 :(得分:0)

1)如果要在某个字段上获得唯一结果,请在distinctbykey中使用实用程序方法filter

public static <T> Predicate<T> distinctByKey(Function<? super T, Object> keyExtractor) {
    Map<Object, Boolean> map = new ConcurrentHashMap<>();
    return t -> map.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;
  }

ArrayList<X> items = new ArrayList();
items = items
  .stream()
  .filter( distinctByKey(x -> x.uniqueFiled()) ) // pass field of X object on basis of you want unique objects
  .collect(Collectors.toList());

2)还有另一种方法可以使列表中没有重复项。 Override类的equals hashX函数,您必须在其中比较Brand字段,然后使用stream的不同方法,它将返回通过调用equalshash函数来列出不同的对象。

ArrayList<X> items = new ArrayList();
items = items
  .stream()
  .distinct()
  .collect(Collectors.toList());

3):如果您实现equalshash函数。然后只需从Set创建一个ListSet具有独特的元素,并且有十个再次从该List创建Set

ArrayList<X> items = new ArrayList();
Set<X> set = new HashSet<X>(items); // Now set has unique elements
items = set.stream().collect(Collectors.toList()); // list have unique elemets too