Java8中使用流的用户定义排序

Java8中使用流的用户定义排序,java,java-8,java-stream,Java,Java 8,Java Stream,我是Java8流API的新手。我的排序规则是:“A”、“C”、“D”、“B” 我有一个结果,它有一个包含8-9个元素和重复元素的对象 下面是我的代码: public class A { private String name; public A() { } public A(String name ) { this.name=name; } public String getName() { return name

我是Java8流API的新手。我的排序规则是:“A”、“C”、“D”、“B”
我有一个结果,它有一个包含8-9个元素和重复元素的对象

下面是我的代码:

public class A
{
private String name;
    public A()
    {
    }
    public A(String name )
    {
     this.name=name;
    }
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    @Override
    public String toString() {
        return "A [name=" + name + "]";
    }
我还有一门课:

public class B
{
   enum TypeEnum{
    A("A"),
    C("C"),
    D("D"),
   B("B");

    private String s;

    private TypeEnum(String s) {
        this.s = s;
    }
}

public static void main(String agrs[] )
   {

   Collection<A> stringCollection = new ArrayList<>();
    stringCollection.add(new A("A"));
    stringCollection.add(new A("D"));
    stringCollection.add(new A("D"));
    stringCollection.add(new A("C"));
    stringCollection.add(new A("D"));
    stringCollection.add(new A("B"));
    stringCollection.add(new A("A"));
    stringCollection.add(new A("A"));

    Predicate<A> aPredicate = a -> a.getName() == TypeEnum.A.name();
    Predicate<A> cPredicate =  a -> a.getName()== TypeEnum.C.name();
    Predicate<A> dPredicate =  a -> a.getName()== TypeEnum.D.name();
    Predicate<A> bPredicate =  a -> a.getName()== TypeEnum.B.name();

    Predicate<A> fullPredicate = aPredicate.and(cPredicate)
            .and(dPredicate).and(bPredicate);

    List<A> list= stringCollection.stream().filter(fullPredicate).collect(Collectors.toList());

    System.out.println(list);
    }
公共B类
{
枚举类型枚举{
A(“A”),
C(“C”),
D(“D”),
B(“B”);
私有字符串;
私有类型枚举(字符串s){
这个.s=s;
}
}
公共静态void main(字符串agrs[])
{
Collection stringCollection=new ArrayList();
stringCollection.add(新增A(“A”));
添加(新的A(“D”));
添加(新的A(“D”));
添加(新的A(“C”));
添加(新的A(“D”));
添加(新的A(“B”));
stringCollection.add(新增A(“A”));
stringCollection.add(新增A(“A”));
谓词aPredicate=a->a.getName()==TypeEnum.a.name();
谓词cPredicate=a->a.getName()==TypeEnum.C.name();
谓词dPredicate=a->a.getName()==TypeEnum.D.name();
谓词bPredicate=a->a.getName()==TypeEnum.B.name();
谓词fullPredicate=aPredicate.and(cPredicate)
.和(D预测)和(B预测);
List List=stringCollection.stream().filter(fullPredicate.collect(Collectors.toList());
系统输出打印项次(列表);
}
这里的输出应该是A,A,A,C,D,D,B


我想使用流java 8 API,按照上面提到的指定规则对元素进行排序。类A是类B中用于将值放入列表中的对象,该列表是类A的类型。最终结果应该按照定义的排序规则进行排序。如果有人面临同样的问题,并且ng相同的解决方案。

您只需按给定列表的位置进行排序:

List<String> order = Arrays.asList("A", "C", "D", "B");
List<A> result = collection.stream()
    .sorted(Comparator.comparingInt(a -> order.indexOf(a.getName())))
    .collect(Collectors.toList());

在这里,未指定的名称根本不会出现在结果中。它会有更好的时间复杂度,但可能会暂时消耗更多内存。

查找
比较器
在SoC上有很多示例,然后请告诉我们您刚才尝试了什么。排序规则是??@ΦXocę웃Пepeúpaツ 排序规则:“A”、“C”、“D”、“B”但这不是一个排序规则,这是一个期望的输出……感谢您的建议和快速回复。如果它解决了您的问题,您可以给出答案。否则,您可以详细说明仍然缺少的内容。@Holger@Jérôme@ΦXocę웃Пepeúpaツ Hi而不是Stream.of(“A”、“C”、“D”、“B”),我想使用Enum来表示我在代码中所做的以下更改,但我不会得到格式为“A”、“C”、“D”、“B”@Holger@Jérôme@ΦXocę的字符串웃Пepeúpaツ Hi而不是Stream.of(“A”、“C”、“D”、“B”),我想使用Enum来实现我在代码中所做的以下更改,但我不会得到格式类似“A”、“C”、“D”、“B”的字符串。public Enum TypeEnum{A(“A”)、C(“C”)、D(“D”)、B(“B”);private String value;private TypeEnum(String value){this.value=value;}//setter getter public static String getString(){LinkedList ls=new LinkedList();for(TypeEnum t:TypeEnum.values()){ls.add(t.getValue());}String str=ls.stream().collect(Collectors.joining(,);return str;}建议在同一个问题上,问题是什么?您的
ls.stream()
生成一个相当于
stream.of(“a”,“C”,“D”,“B”)
如果您的任务仍然与问题中的任务相同,您可以使用完全相同的方法(因为我不知道
收集(Collectors.joining(“,”)
)的目的。但是根本没有理由使用
列表(更不用说
链接列表了)
;您可以使用
EnumSet.allOf(TypeEnum.class).stream().map(Enum::name)
(也适用于
Enum TypeEnum{A,C,D,B}
,不带冗余字符串,或者如果坚持
getValue()
Map<String, List<A>> m = collection.stream().collect(Collectors.groupingBy(A::getName));
List<A> result = Stream.of("A", "C", "D", "B")
    .flatMap(s -> m.getOrDefault(s, Collections.emptyList()).stream())
    .collect(Collectors.toList());