当前位置: 首页 > 知识库问答 >
问题:

如何对存储在不同数组中的数据应用气泡排序

浦琪
2023-03-14

我可以根据编号对下面的代码进行排序吗?

就像数据被排序一样,假设升序应该如下所示:

001  Graciella
012  Steven
094  Marcellin

... and so on 

我的代码:

String [][] sis = new String [][] {
    {"001",  "980", "777", "169","094","233", "012"},
    {"Graciella","Martinus","Renata","Vianney","Marcellin", "Joakim", "Steven"}
};      

System.out.println(sis[0][0]+" "+ sis[1][0]);
System.out.println(sis[0][1]+" "+ sis[1][1]);
System.out.println(sis[0][2]+" "+ sis[1][2]);
System.out.println(sis[0][3]+" "+ sis[1][3]);
System.out.println(sis[0][4]+" "+ sis[1][4]);
System.out.println(sis[0][5]+" "+ sis[1][5]);
System.out.println(sis[0][6]+" "+ sis[1][6]);

我试过以下方法,但我觉得我做错了什么。但我不知道是什么。

String num [] = {"001", "980", "777", "169", "094", "233", "012"};
int NUM [] = new int[num.length];
        
for (int i = 0; i < NUM.length;i++) {
    NUM[i] = Integer.parseInt(num[i]);
}
        
String nem [] = {"Graciella","Martinus","Renata","Vianney","Marcellin", "Joakim", "Steven"};
        
        
for (int i = 0; i < 6; i++) {
    for(int j = 0; j < 6; j++) {
        if (num[j].compareTo(num[j+1]) > 0) {
            String temp = num[j];
            num[j] = num[j+1];
            num[j+1]= temp;
        }
    }
}
        
System.out.println();
        
for (int i = 0; i < 6; i++) {
    for(int j = 0; j < 6; j++) {
        if (nem[j].compareTo(nem[j+1]) > 0) {
            String temp = nem[j];
            nem[j] = nem[j+1];
            nem[j+1]= temp;
        }
    }
}

for (int j = 0; j < 6; j++) {
    System.out.println(num[j] + " " + nem[j]);
}

你能告诉我我做错了什么吗?我可以根据名称对这些数据进行排序吗?

共有2个答案

邵畅
2023-03-14

我在代码中添加了注释以进行解释。我没有包括一些最佳代码实践(即不要重复代码),我只是专注于算法。

同样最简单的方法是首先创建将两个字符串(数字和名称)连接在一起的新数组,然后对这个额外的数组进行排序。但是我不知道你是否因为其他原因需要对原始数组进行排序,因此我保持原样。

    for (int i = 0; i < 6; i++) {
        for(int j = 0; j < 6; j++) {
            if (num[j].compareTo(num[j+1]) > 0) {                   
                String temp = num[j];
                num[j] = num[j+1];
                num[j+1]= temp;

                // You need to switch this as well as you keep it as pair, so it has to be
                // in same position after shift

                temp = nem[j];
                nem[j] = nem[j+1];
                nem[j+1]= temp;
            }
        }
    }
    
    System.out.println();
    
    for (int i = 0; i < 6; i++) {
        for(int j = 0; j < 6; j++) {
            // only if the number is the same, then check which string has priority
            if (nim[j] == nim[j+1] && nem[j].compareTo(nem[j+1]) > 0) {
                String temp = nem[j];
                nem[j] = nem[j+1];
                nem[j+1]= temp;

                // You need to keep the other array in sync
                temp = num[j];
                num[j] = num[j+1];
                num[j+1]= temp;
            }
        }
    }
宦炜
2023-03-14

正如@Elliott Frisch在评论中指出的那样,如果将这些数据视为对象,而不是将Person属性分散在两个不同的数组中,则会更容易和更清晰,这会使您的解决方案变得脆弱和不灵活。

这就是Person类的样子:

public class Person {
    private int id;
    private String name;
    
    public Person(int id, String name) {
        this.id = id;
        this.name = name;
    }
    
    public int getId() {
        return id;
    }
    
    public String getName() {
        return name;
    }
    
    @Override
    public String toString() {
        return String.format("%03d %s", id, name);
    }
}

这就是我们如何实现冒泡排序。

注意:不需要遍历嵌套循环中的孔数组(条件<代码>j

此外,硬编码值,如条件<代码>j中的值

public static void sortPeopleWithBubbleSort(Person[] people) {
    for (int i = 0; i < people.length; i++) {
        for (int j = 0; j < people.length - 1 - i; j++) {
            if (people[j].getId() > people[j + 1].getId()) {
                Person temp = people[j + 1];
                people[j + 1] = people[j];
                people[j] = temp;
            }
        }
    }
}

main()

public static void main(String[] args) {
    Person[] people = new Person[]{
        new Person(1, "Graciella"),
        new Person(980, "Martinus"),
        new Person(777, "Renata"),
        new Person(169, "Vianney"),
        new Person(94, "Marcellin"),
        new Person(233, "Joakim"),
        new Person(12, "Steven")
    };
    // sorting
    sortPeopleWithBubbleSort(people);
    // printing
    for (Person person: people) {
        System.out.println(person);
    }
}

输出:

001 Graciella
012 Steven
094 Marcellin
169 Vianney
233 Joakim
777 Renata
980 Martinus

正如@hfontanez在评论中所建议的那样,我们可以通过提供额外的参数-比较器(用于比较没有自然顺序的对象的特殊对象),使sortPeopleWithBubbleSort()方法更加灵活。

它可能看起来像这样:

// sorting by id
Comparator<Person> byId = Comparator.comparingInt(Person::getId);

sortPeopleWithBubbleSort(people, byId);
// sorting by name
Comparator<Person> byName = Comparator.comparing(Person::getName);

sortPeopleWithBubbleSort(people, byName);
public static void sortPeopleWithBubbleSort(Person[] people,
                                            Comparator<Person> comparator) {
    
    for (int i = 0; i < people.length; i++) {
        for (int j = 0; j < people.length - 1 - i; j++) {
            if (comparator.compare(people[j], people[j + 1]) > 0) {
                Person temp = people[j + 1];
                people[j + 1] = people[j];
                people[j] = temp;
            }
        }
    }
}

要了解如何使用Java-8方法构建比较器,请查看这篇文章。如果您对Java8个函数式编程特性不满意,最好从本教程开始。

 类似资料:
  • 编辑:最后一个问题,如何通过值而不是引用来存储它?

  • 我需要使用气泡排序法按名称对我的杂货库存进行排序。 显然,我的代码不是按名字排序的 顺便说一句,库存存储的数据来自文件输入。 这是我的代码。 这是我的比较方法从我的超类(杂货店项目)

  • 问题内容: 我有一个要存储在Redis中的对象数组。我可以分解数组部分,并将它们存储为对象,但是我不知道如何获得类似 然后根据名称搜索数据库,并获取返回的密钥。我需要这样的东西。但几乎无法做到正确。 首先是使这一部分正确。 其次是以某种方式从值中获取密钥,即 我觉得很难。或者,我可以将其直接存储为对象数组并使用简单的for循环。 请建议哪种路线最适合某些实现? 问题答案: 我发现工作是将密钥存储为

  • 我目前正在使用axios从我的api中提取JSON数据,我正在映射这个数据并将其存储为变量。我希望能够在我的react组件中调用这些变量,但我似乎找不出最好的方法。 获取JSON数据并将其存储为变量 我希望能够在react组件中调用类似Profile.Major的东西,但我目前尝试的方法并不奏效。请让我知道这样做的正确方法。提前谢谢你。

  • 如何从主方法调用 bubbleSort 方法以打印排序的列表数组。我已经将10个随机数生成到一个数组中,但我还没有弄清楚如何调用bubbleSort并打印结果。我在这里错过了什么? 公共类 Bubblesort{ 公共静态void main(String[] args) { } }

  • 问题内容: 我有两个不同的数组,一个带有字符串,另一个带有整数。我想将它们连接成一个数组,其中每一列都具有原始数据类型。我当前执行此操作的解决方案(请参见下文)将整个数组转换为dtype = string,这似乎在内存方面效率很低。 何时和何时可能使dtypes多元化? 问题答案: 一种方法可能是使用记录数组。“列”与标准numpy数组的列不同,但是对于大多数用例来说,这就足够了: 请注意,您还可