【问题标题】:How to sort multiple ArrayLists based off order of another?如何根据另一个的顺序对多个 ArrayLists 进行排序?
【发布时间】:2014-05-24 10:04:12
【问题描述】:

我无法确定根据一个列表的排序顺序对多个列表进行排序的最佳方法。目前,这些列表是根据它们的索引排序的。离开时间列表包含格式为 (00:00 AM/PM) 的时间字符串。它们是这样初始化的:

public static List<String> departureTime = new ArrayList<String>();
public static List<String> mode = new ArrayList<String>(); 
public static List<String> busNo = new ArrayList<String>();
public static List<String> busStopName = new ArrayList<String>();
public static List<String> arrivalTime = new ArrayList<String>();
public static List<String> dur = new ArrayList<String>();

我需要根据离开时间数组列表中的出发时间排序顺序对所有列表进行排序。在不更改结果数据结构的情况下对这些列表进行排序的最佳方法是什么。任何帮助将不胜感激。

谢谢,

马特

【问题讨论】:

  • 通过创建一个包含每个列表中的值的对象来解决这个问题会更容易。然后,您可以拥有一个对象列表并根据您关心的值进行排序。

标签: java android sorting arraylist


【解决方案1】:

如评论中所述,创建一个包含所有值的对象会更容易,然后只需对对象列表进行排序。

如果由于某种原因这是不可能的,您将需要编写自己的排序方法,例如选择排序,同时对列表中的所有对象进行排列操作。

这是一个简单但非最优的算法。随意调整它以适应其他类型。这只有在所有列表都具有相同长度时才有效。

    public void sort() {
    String[] departureTimeArray = departureTime.toArray(new String[departureTime.size()]);
    String[] modeArray = mode.toArray(new String[mode.size()]);
    //here you convert the other lists to arrays

    int lenD = departureTimeArray.length;
    int j = 0;
    for(int i=0;i<lenD;i++){
        j = i;
        for(int k = i;k<lenD;k++){
            if(departureTimeArray[j].compareTo(departureTimeArray[k])>0){
                j = k;
            }
        }
        permutation(departureTimeArray, i, j);
        permutation(modeArray, i, j);
        //here do the same for other arrays
    }

    departureTime = Arrays.asList(departureTimeArray);
    mode = Arrays.asList(modeArray);
    //here convert back arrays to list
}

private void permutation(String[] array, int i, int j) {
    String tmp = array[i];
    array[i] = array[j];
    array[j] = tmp;
}

例如,请参见此处的选择排序算法: selection sort

【讨论】:

  • 您好 Yves,我已经实现了您的解决方案,但结果我的应用程序崩溃了。我所有的列表都具有相同的长度,departmentTimeArray 中每个字符串的格式是 hh:mm a(下午 3:32)。 Logcat 指出转换存在问题:java.lang.Object[] 无法转换为 java.lang.String[]。但是,departmentTimeArray 被初始化为 String 类型的 ArrayList。你知道为什么会发生这种情况吗?谢谢,马特
  • 我不得不稍微改变你的答案来处理转换错误。我能够让它工作。谢谢!
  • 你好,我刚刚看到你的答案,我想我必须在 toArray 方法中给出一个新的 String[] 作为参数,我以这种方式修改了我的答案
【解决方案2】:

您可以在排序之前保存每个出发时间的索引Hashmap&lt;String, Integer&gt;。然后像往常一样只对该列表进行排序,然后将索引再次保存在另一个哈希图中。

现在您知道给定的字符串在排序前位于n 位置,而在排序后现在位于n' 位置。因此,您可以使用此信息手动交换其他列表的元素。

这种方法很脆弱,因为如果列表中有重复的元素,那么排序后你就无法知道哪个是哪个。因此,您最好按照其他答案中的建议创建一个容器类。

【讨论】:

    猜你喜欢
    • 2015-06-08
    • 2013-11-10
    • 1970-01-01
    • 1970-01-01
    • 2012-08-27
    • 1970-01-01
    • 2012-04-03
    • 2022-01-28
    • 1970-01-01
    相关资源
    最近更新 更多