Java 选择类X的ArrayList的不同字段

Java 选择类X的ArrayList的不同字段,java,performance,arraylist,Java,Performance,Arraylist,我有一个X类数组列表 ArrayList<X> items = new ArrayList(); ArrayList items=new ArrayList(); 类X包含多个字段,所有字段都是字符串类型。(id、说明、品牌等) 如果我想得到这个类的ArrayList,它只包含给定字段的不同值,我该怎么办 实际上: 如何获得包含所有品牌但没有重复的X类ArrayList?(获取项目中的所有品牌,但没有品牌两次) 或者有没有更好/更有效的方法只获取品牌列表 \我不使用Java8 希

我有一个X类数组列表

ArrayList<X> items = new ArrayList();
ArrayList items=new ArrayList();
类X包含多个字段,所有字段都是字符串类型。(id、说明、品牌等)

如果我想得到这个类的ArrayList,它只包含给定字段的不同值,我该怎么办

实际上:

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

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

\我不使用Java8


希望这不会太混乱。

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

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

// "s" now contains all distinct "field"
Set s=newhashset();
对于(X X:项目){
s、 添加(x.getField());
}
//“s”现在包含所有不同的“字段”
应该有一个使用lambda和streams的代码版本。但IMO这样简单的代码并不需要它

 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/streams

    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));
    }
Map Map=newhashmap();
用于(X项:项){
如果(!map.containsKey(item.getBrand())){
map.put(item.getBrand(),newArrayList());
}否则{
map.get(item.getBrand()).add(item);
}
}
列表结果=新建ArrayList();
对于(Map.Entry e:Map.entrySet()){
添加(e.getValue().get(0));
}
1)如果要在某个字段上获得唯一的结果,请在
过滤器中使用实用方法
distinctbykey

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());
3)如果实现
等于
散列
函数。然后,只需从
列表
创建一个
集合
<代码>集合
具有唯一的元素,然后再次从该集合创建
列表

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
ArrayList items=new ArrayList();
Set Set=新哈希集(项);//现在set有了独特的元素
items=set.stream().collect(Collectors.toList());//列表也有唯一的元素

存储在
集合中的所有品牌
OP希望列表包含
X
对象,而不是字符串。
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