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

java中基于其他数组的数组排序

终翰学
2023-03-14

我有2个java数组

int[] num={5,2,10,12,4};
String[] name={"a","b","g","c","r"};

如果我按升序对int数组排序,它将是:

int[] num={2,4,5,10,12};

现在我想相应地对名称数组进行排序。输出应为:

String[] name={"b","r","a","g","c"};

我该如何维持一段关系?我见过这个链接(基于其他排序的数组排序数组),但它是针对js的

共有3个答案

包承望
2023-03-14

您可以构建一个包含所有有效索引的流,根据< code>num数组对该流进行排序,然后将索引映射到< code>name值,并将它们收集到一个新数组中。

String[] nameSorted = IntStream.range(0, num.length).boxed()
        .sorted((i, j) -> Integer.compare(num[i], num[j]))
        .map(i -> name[i])
        .toArray(x -> new String[x]);

如果需要(由于<code>name</code>数组作为引用传递,要就地“排序”),只需将排序后的值复制到原始数组:

System.arraycopy(nameSorted, 0, name, 0, name.length);

请注意,以这种方式,数组num保持不变。

正如提问者已经理解的和Jayanand提到的那样,只要排序算法发出指令,只要同时交换两个数组中的元素,任务也很容易完成。

直接使用这两个数组的实现:

for (int i = 0; i < num.length; i++) {
    for (int j = i + 1; j < num.length; j++) {
        if (num[i] > num[j]) {
            int tempNum = num[i];
            String tempName = name[i];
            num[i] = num[j];
            name[i] = name[j];
            num[j] = tempNum;
            name[j] = tempName;
        }
    }
}

如果要将逻辑和值访问分开,以便冒泡排序几乎可用于任何风格索引数据结构

public static void bubbleSort(int length, IntBinaryOperator comparator,
        BiConsumer<Integer, Integer> swapOperation) {
    for (int i = 0; i < length; i++)
        for (int j = i + 1; j < length; j++)
            if (comparator.applyAsInt(i, j) > 0)
                swapOperation.accept(i, j);
}

bubbleSort(num.length, 
        (i, j) -> Integer.compare(num[i], num[j]), 
        (i, j) -> {
            int tempNum = num[i];
            String tempName = name[i];
            num[i] = num[j];
            name[i] = name[j];
            num[j] = tempNum;
            name[j] = tempName;
        });

由于气泡排序的平均复杂度为 O(n²)(请参阅维基百科上的描述),因此在这里抱怨不必要的整数装箱和拆箱没有多大意义。

为保留< code>num和< code>name值的对象创建一个新类:

class Item {
    int num;
    String name;
    Item(int num, String name) {
        this.num = num;
        this.name = name;
    }
}

现在,如果您有例如列表

items.sort(Comparator.comparing(item -> item.num));

要从数组中创建这样的列表,您可以使用(类似于使用Streams API进行排序):

List<Item> items = IntStream.range(0, num.length)
        .mapToObj(i -> new Item(num[i], name[i]))
        .collect(Collectors.toList());

什么可以被认为是最佳解决方案在很大程度上取决于您拥有的特定用例。

如果您别无选择,只能使用这两个数组,因为它们是在一些API或项目的上下文中传递给您的,而您无法更改设计气泡排序和定制的比较和交换操作,那么只要您没有成千上万的值要排序,这种情况下将会非常慢。

如果您可以自由决定如何对num/name-对建模,我强烈建议为那些已经由iavanish指出的类设计一个特定的类。一定要相应地实现< code>equals和< code>hashCode,并记住在实现< code>Comparable接口时,它应该反映自然顺序,该顺序应该与< code>equals方法同步。因此,当对两个对象(5,a)和(5,b)调用< code>equals并且结果为< code>false时,< code>compareTo方法不应返回0。如果您需要一个不自然的特殊顺序,请使用< code>Comparator。

在处理大量值时,应优先使用Streams API进行排序,以便可以忽略初始化和整数装箱/拆箱开销。在这种情况下,还可以额外使用。并行()以获得更高的速度。

洪鸿博
2023-03-14

抱歉,这很简单:

int[] num={5,2,10,12,4};
String[] name={"a","b","g","c","r"};
int tempNum;
String tempName;

for (int i = 0; i < num.length; i++) 
        {
            for (int j = i + 1; j < num.length; j++) 
            {
                if (num[i] > num[j]) 
                {
                    tempNum = num[i];
                    tempName=name[i];

                    num[i] = num[j];
                    name[i] = name[j];

                    num[j] = tempNum;
                    name[j] = tempName;
                }
            }
        }
宣熙云
2023-03-14

您可以使用组合数据创建自定义类,即一个整数变量和一个字符串变量。这个类将实现Comparable接口并覆盖它的compareTo()方法。然后创建这个类的对象数组,使用util库的normal Arrays.sort()函数进行排序。

public class Data implements Comparable<Data> {
    int num;
    String name;

    @Override
    public int compareTo(Data data) {
        return this.num - data.num;
    }
}

用法:

Data[] data = new Data[5];
// initialize data
Arrays.sort(data)
// now the num will be sorted in ascending order and name will be shuffled accordingly
 类似资料:
  • 有没有更时髦的方法来解决这个问题?

  • 问题内容: 我在蜂巢中有一张桌子,两列分别为和。输出如下图 我想按升序对该col2进行排序,并且col1还应相应地更改其索引,例如 问题答案: 分解两个数组,进行排序,然后再次聚合数组。在子查询中使用之前对数组进行排序: 结果: 编辑:同一脚本的简化版本,您可以不用第二次posexplode,而是按位置使用直接引用

  • 例如,我有以下数据集: 我需要根据数组中的条件对数组进行排序。我最终得出了这样的解决方案: 但我无法理解如何使用数组而不是硬编码的和属性。数组可以有许多属性。

  • 问题内容: 输出: iCheck 10 阵列值200的值 从上面的代码中,我发现,如果将任何数组分配给另一个数组,并且更改了数组的任何值,则该结果也将反映在该数组中,而同一场景中没有使用变量赋值。为什么? 问题答案: 以下语句引用与以下相同的数组: 如果要复制,可以使用或: 对象(包括集合类,实例,等)以类似的方式工作,在分配一个变量到另一个简单的拷贝基准,使得两个变量指代相同的对象。如果所讨论的

  • 问题内容: 我有一个像这样的数组: 我想基于第二元素按降序对其进行排序。理想的输出为: 问题答案: ,接受可选参数。函数用于生成比较密钥。

  • 问题内容: 给定不同整数的数组,打印数组的所有排列。 例如: 问题答案: 我们可以借助递归来解决问题。递归很难解释,所以我创建了一个递归树来演示它。 这是相同的代码。 当你运行上面的程序时,你会得到以下输出: 我已经用下图说明了递归是如何在这里工作的。 您需要在新窗口中打开此图表并对其进行缩放。 由于数组中有 3 个元素,因此每个节点有 3 个分支。