【问题标题】:sort by : high to low sort by: low to high排序方式:从高到低排序方式:从低到高
【发布时间】:2023-06-14 16:40:01
【问题描述】:

使用这个怎么办当我把高到低或低到高时它会排列?

String [][]Data={{"Eugine","8"},{"Ben","9"},{"John","19"},{"Jairus","5"},{"Sofia","13"}};

输出排序:从高到低 John",19 Sofia,13 Ben",9 Eugine,8 Jairus,5 排序方式 : 从低到高 睚鲁,5 尤金,8 本,9 索菲亚,13 约翰,19


//This is just my noob code// //please help//
 String [][] Data={{"Eugine","8"},{"Ben","9"},{"John","19"},{"Jairus","5"},{"Sofia","13"}};
            Arrays.sort(people);
            for(Person p : people)
                System.out.println(p.name + ", " + p.age);
        }
    }

    class Person implements Comparable<Person>{
        public final String name;
        public final int age;[enter image description here][1]
        public Person(String name, int age){
            this.name = name;
            this.age = age;
        }
        @Override
        public int compareTo(Person person) {
            return age - person.age;
        }

【问题讨论】:

  • 你的代码的目的是什么?你想达到什么目的?为什么不创建一个“Person”类型的数组?
  • 如果您的代码有效,将compareTo() 中的参数更改为return person.age - age; 将改变排序顺序。

标签: java arrays string methods bubble-sort


【解决方案1】:

由于您尝试以不同的方式进行排序,因此您需要使用Comparator

您可以通过以下方式进行操作:

[通过创建和使用单独的比较器]

import java.util.Arrays;
import java.util.Comparator;

class Person {
    private String name;
    private int age;

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

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    @Override
    public String toString() {
        return name + " age " + age;
    }
}

class LowToHighComparator implements Comparator<Person> {

    @Override
    public int compare(Person p1, Person p2) {
        return Integer.compare(p1.getAge(), p2.getAge());
    }
}

class HighToLowComparator implements Comparator<Person> {

    @Override
    public int compare(Person p1, Person p2) {
        return Integer.compare(p2.getAge(), p1.getAge());
    }
}

public class Main {
    public static void main(String[] args) {
        Person[] people = { new Person("Eugine", 8), new Person("Ben", 9), new Person("John", 19),
                new Person("Jairus", 5), new Person("Sofia", 13) };

        Person[] lowToHigh = people.clone();
        Person[] highToLow = people.clone();

        Arrays.sort(lowToHigh, new LowToHighComparator());
        Arrays.sort(highToLow, new HighToLowComparator());

        System.out.println("Unsorted: ");
        Arrays.stream(people).forEach(System.out::println);
        System.out.println();

        System.out.println("Low to high: ");
        Arrays.stream(lowToHigh).forEach(System.out::println);
        System.out.println();

        System.out.println("High to low: ");
        Arrays.stream(highToLow).forEach(System.out::println);
    }
}

输出:

Unsorted: 
Eugine age 8
Ben age 9
John age 19
Jairus age 5
Sofia age 13

Low to high: 
Jairus age 5
Eugine age 8
Ben age 9
Sofia age 13
John age 19

High to low: 
John age 19
Sofia age 13
Ben age 9
Eugine age 8
Jairus age 5

[通过使用Comparator.comparing]

import java.util.Arrays;
import java.util.Comparator;

class Person {
    private String name;
    private int age;

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

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    @Override
    public String toString() {
        return name + " age " + age;
    }
}

public class Main {
    public static void main(String[] args) {
        Person[] people = { new Person("Eugine", 8), new Person("Ben", 9), new Person("John", 19),
                new Person("Jairus", 5), new Person("Sofia", 13) };

        Person[] lowToHigh = people.clone();
        Person[] highToLow = people.clone();

        Arrays.sort(lowToHigh, Comparator.comparing(Person::getAge));
        Arrays.sort(highToLow, Comparator.comparing(Person::getAge).reversed());

        System.out.println("Unsorted: ");
        Arrays.stream(people).forEach(System.out::println);
        System.out.println();

        System.out.println("Low to high: ");
        Arrays.stream(lowToHigh).forEach(System.out::println);
        System.out.println();

        System.out.println("High to low: ");
        Arrays.stream(highToLow).forEach(System.out::println);
    }
}

输出:

Unsorted: 
Eugine age 8
Ben age 9
John age 19
Jairus age 5
Sofia age 13

Low to high: 
Jairus age 5
Eugine age 8
Ben age 9
Sofia age 13
John age 19

High to low: 
John age 19
Sofia age 13
Ben age 9
Eugine age 8
Jairus age 5

【讨论】:

  • 如何添加“年龄” 从低到高:睚鲁 5 岁 Eugine 8 岁 Ben 9 岁 Sofia 13 岁 John 19 岁 从高到低:John 19 岁 Sofia 13 Ben 9 岁 Eugine 8 Jairus 5岁
  • 谢谢!我无法编码,因为我们没有网络。感谢您的努力和我的要求
【解决方案2】:

我无法真正理解您希望您的代码如何工作,但如果您在简单地对这些值进行排序时遇到问题,那么我想我已经涵盖了您。不要存储在字符串数组中,而是使用 TreeMaps。

我将数字存储为键,将它们各自的名称存储为值,并将它们存储在 TreeMap 中,它按排序顺序(从低到高)存储它们。您还可以使用 Collections.reverseOrder() 以相反的顺序显示它们。

import java.util.*;

class Main {
  public static void main(String[] args) {

    TreeMap<Integer, String> map = new TreeMap<>();

    map.put(8, "Eugene");
    map.put(9, "Ben");
    map.put(19, "John");
    map.put(5, "Jairus");
    map.put(13, "Sofia");

    System.out.println("From low to high");

    for(Integer i : map.keySet()){
      System.out.println(map.get(i) + ", " + i);
    }

    TreeMap<Integer, String> revMap = 
      new TreeMap<Integer, String>(Collections.reverseOrder());

    revMap.putAll(map);

    System.out.println("\nFrom high to low");
    for(Integer i : revMap.keySet()){
      System.out.println(revMap.get(i) + ", " + i);
    }
  }
}

【讨论】: