如何用另一个字符串数组对double数组进行排序?

时间:2016-05-02 10:30:08

标签: java android

我尝试使用另一个字符串数组对双数组进行排序: 它的意思是 我有这个:

Double[] values = {6.3, 5.5 , 7.0};
String [] names ={"samah","Dalal", "Mohammad"};

samah5.5Dalal6.3Mohammad7.0

如果我想对双值进行排序,使用它很简单:

Arrays.sort(values);

在这种情况下,结果为{5.5,6.3,7.0}

但是如何保持这种名字数组? 结果必须是:{"Dalal","samah","Mohammad"}

由于

5 个答案:

答案 0 :(得分:3)

添加包含两个值的新类型并实现Comparable

public class Person implements Comparable<Person> {

  private String name;
  private double score;

  public Person(final String name, final double score) {
    this.name = name;
    this.score = score;
  }

  public String getName() {
      return name;
  }

  public void setName(final String name) {
      this.name = name;
  }

  public double getScore() {
      return score;
  }

  public void setScore(final double score) {
      this.score = score;
  }

  @Override
  public int compareTo(final Person another) {
      return Double.compare(score, another.score);
  }
}

现在,当Person排序时,Arrays.sort()数组应按分数排序。

答案 1 :(得分:0)

如果我错了,请纠正我,目的是正确存储名称及其相应的值,如果是这样的话,

为什么使用两个不同的阵列? 为什么不在地图中读取值和名称?

如果您在地图中阅读它们,则不必面对维护名称和值的顺序的问题。 如果这样做,将减少对排序的需求。

答案 2 :(得分:0)

使用TreeMap作为双数据键,将值作为字符串数据。 TreeMap由其键自动排序。

答案 3 :(得分:0)

您也可以使用Comparator解决此问题。如果要根据标记进行排序,请使用PersonMarksComparator,如果要根据名称使用PersonNameComparator对其进行排序。如果您想以多种方式对其进行排序,这将非常有用。

class PersonMarksComparator implements Comparator<Person> {

  @Override
  public int compare(Person person1, Person person2) {
      return Double.compare(person1.getMarks(), person2.getMarks());
  }
}

class PersonNameComparator implements Comparator<Person> {

  @Override
  public int compare(Person person1, Person person2) {
      return person1.getName().compareTo(person2.getName());
  }
}

public class Person {

   private String name;
   private double marks;

   public Person(final String name, final double marks) {
      this.name = name;
      this.marks = marks;
   }

   //getters and setters

   public static void main(String[] args) {
      List<Person> persons = new ArrayList<Person>();
      Person person1 = new Person("samah", 5.5);
      Person person2 = new Person("Dalal", 6.3);
      Person person3 = new Person("Mohammad", 7.0);
      persons.add(person1);
      persons.add(person2);
      persons.add(person3);
      Collections.sort(persons, new PersonMarksComparator());
      Collections.sort(persons, new PersonNameComparator());
  }
}

答案 4 :(得分:0)

试试这个。 (对于Java8)

Double[] values = {6.3, 5.5 , 7.0};
String [] names ={"samah","Dalal", "Mohammad"};
String[] sortedNames = IntStream.range(0, names.length)
    .mapToObj(i -> i)
    .sorted(Comparator.comparing(i -> values[i]))
    .map(i -> names[i])
    .toArray(String[]::new);
System.out.println(Arrays.toString(sortedNames));

结果:

[Dalal, samah, Mohammad]

过程:

  1. 制作IntStream个索引 - &gt; [0,1,2]
  2. 将每个索引转换为Integer对象 - &gt; [0,1,2]
    (因为IntStrem没有sorted(Comparator)方法)
  3. 按值[index] - &gt;对每个索引进行排序[1,0,2]
  4. 将每个索引映射到名称[index] - &gt; [&#34; Dalal&#34;,&#34; samah&#34;,&#34; Mohamand&#34;]
  5. 将结果另存为数组 - &gt; [&#34; Dalal&#34;,&#34; samah&#34;,&#34; Mohamand&#34;]