首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >建立基于多个参数的排序列表?

建立基于多个参数的排序列表?
EN

Stack Overflow用户
提问于 2017-09-04 18:01:31
回答 4查看 105关注 0票数 1

我有三个数组

代码语言:javascript
复制
String[] persons = {"jack","james","hill","catnis","alphonso","aruba"};
int[] points = {1,1,2,3,4,5};
int[] money = {25,66,24,20,21,22};

这三个数组中的第n个位置属于同一个实体,例如:-

个人==指出==的钱,即杰克有1分和25美元的

我想要构建一个对person alphabetically(ascending)排序的列表,如果起始字母相同,那么它应该检查points(descending),如果它们也是相同的,那么它必须检查money(descending).

排序后的最终列表应该是{阿鲁巴、阿方索、卡尼斯、希尔、詹姆斯、杰克}。

EN

回答 4

Stack Overflow用户

发布于 2017-09-04 18:18:15

所以我想你想要这样的东西:

代码语言:javascript
复制
public class Person {
   String name;
   int points;
   int money;

   public Person(String name, int points, int money) {
       this.name = name;
       this.points = points;
       this.money = money;
   }

   // getters
}

然后用您拥有的数据(例如,List<Person> )创建一个new Person("jack", 1, 25)。然后分类:

代码语言:javascript
复制
Collections.sort(persons, (person1, person2) -> {
    // could be written more concisely, but this should make things clear
    char letter1 = person1.getName().charAt(0);
    char letter2 = person2.getName().charAt(0);
    if (letter1 != letter2) {
        return letter1 - letter2;
    }
    int points1 = person1.getPoints();
    int points2 = person2.getPoints();
    if (points1 != points2) {
        return points2 - points1; // notice the order is reversed here
    }
    int money1 = person1.getMoney();
    int money2 = person2.getMoney();
    if (money1 != money2) {
        return money2 - money1;
    }
    return 0; // unless you want to do something fancy for tie-breaking
});

这将根据您的标准给出一个排序的List<Person>

票数 3
EN

Stack Overflow用户

发布于 2017-09-04 18:42:30

如果你想干些又快又脏的事:

代码语言:javascript
复制
    Comparator<Integer> cName = (i, j) -> Character.compare( persons[i].charAt(0), persons[j].charAt(0));
    Comparator<Integer> cPoints = (i, j) -> Integer.compare( points[i], points[j]);
    Comparator<Integer> cMoney = (i, j) -> Integer.compare( money[i], money[j]);

    List<String> l = 
            IntStream.range(0, persons.length).boxed()
            .sorted( cName.thenComparing(cPoints.reversed()).thenComparing(cMoney.reversed()) )
            .map( i -> persons[i] )
            .collect(Collectors.toList());

    System.out.println(l);

前3行使用lambda定义基于数组索引的比较器。

下面的行使用流:

  1. 创建索引的int流,从0到Persons.ength-1
  2. 基于比较器序列的流排序索引
  3. 将排序索引映射到人名
  4. 把它整理成一张清单

兰达和溪流不是很酷吗?

票数 3
EN

Stack Overflow用户

发布于 2017-09-04 18:33:22

如果您可以拥有一个Person模型:

代码语言:javascript
复制
final class Person {
  private final String name;

  private final int points;

  private final int money;

  public Person(final String name, final int points, final int money) {
    this.name = name;
    this.points = points;
    this.money = money;
  }

  // getters and setters (if you want)

  @Override
  public String toString() {
    final StringBuffer sb = new StringBuffer("Person {")
        .append("name=")
        .append(name)
        .append(", points=")
        .append(points)
        .append(", money=")
        .append(money)
        .append('}');
    return sb.toString();
  }
}

然后你可以这样做:

代码语言:javascript
复制
public static void main(final String... args) throws Exception {
  Person[] persons = new Person[6]; // Use a List (if you can)
  persons[0] = new Person("jack", 1, 25);
  persons[1] = new Person("james", 1, 66);
  persons[2] = new Person("hill", 2, 24);
  persons[3] = new Person("catnis", 3, 20);
  persons[4] = new Person("alphonso", 4, 21);
  persons[5] = new Person("aruba", 5, 22);
  System.out.printf("persons = %s%n%n", Arrays.toString(persons));
  System.out.printf("Person[0] = %s%n%n", persons[0]);
  Collections.sort(Arrays.asList(persons), (c1, c2) -> {
    final int charComp = Character.compare(c1.name.charAt(0), c2.name.charAt(0));
    if (0 == charComp) {
      final int pointsComp = Integer.compare(c2.points, c1.points);
      if (0 == pointsComp) { return Integer.compare(c2.money, c1.money); }
      return pointsComp;
    }
    return charComp;
  });
  // The collection was modified at this point because of the "sort"
  System.out.printf("persons = %s%n", Arrays.toString(persons));
}

结果:

Person = Person {name=jack,points=1,money=25},Person {name=james,points=1,money=66},Person {name=hill,points=2,money=24},Person {name=catnis,points=3,money=20},Person {name=alphonso,points=4,money=21},Person {name=aruba,points=5,money=21} Person = Person {name=jack,points=1,money=25} Person = Person {name=aruba,points=5,money=22},Person {name=alphonso,points=4,money=21},Person {name=catnis,points=3,money=20},Person {name=hill,points=2,money=24},Person {name=james,points=1,money=66},Person {name=jack,points=1,money=66}

一个更紧凑的sort (但效率有点低,因为您必须预先运行所有比较):

代码语言:javascript
复制
Collections.sort(Arrays.asList(persons), (c1, c2) -> {
  final int names = Character.compare(c1.name.charAt(0), c2.name.charAt(0));
  final int points = Integer.compare(c2.points, c1.points);
  final int money = Integer.compare(c2.money, c1.money);
  return (0 == names) ? ((0 == points) ? money : points) : names;
});
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46042137

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档