基于一列对二维数组进行排序

Len*_*ran 40 java arrays sorting

在Java中,我的数组中有一个数据,如下所示

2009.07.25 20:24 Message A
2009.07.25 20:17 Message G
2009.07.25 20:25 Message B
2009.07.25 20:30 Message D
2009.07.25 20:01 Message F
2009.07.25 21:08 Message E
2009.07.25 19:54 Message R
Run Code Online (Sandbox Code Playgroud)

我想根据第一列对其进行排序,因此我的最终数据可能如下所示

2009.07.25 19:54 Message R
2009.07.25 20:01 Message F
2009.07.25 20:17 Message G
2009.07.25 20:24 Message A
2009.07.25 20:25 Message B
2009.07.25 20:30 Message D
2009.07.25 21:08 Message E
Run Code Online (Sandbox Code Playgroud)

第一列是格式为"yyyy.MM.dd HH:mm"的日期,第二列是字符串.

Ber*_*t F 75

基于一列
对二维数组进行排序第一列是格式为"yyyy.MM.dd HH:mm"的日期,第二列是String.

既然你说2-D数组,我假设"格式的日期..."意味着一个字符串.这是用于对String [] []的二维数组进行排序的代码:

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

public class Asdf {

    public static void main(final String[] args) {
        final String[][] data = new String[][] {
                new String[] { "2009.07.25 20:24", "Message A" },
                new String[] { "2009.07.25 20:17", "Message G" },
                new String[] { "2009.07.25 20:25", "Message B" },
                new String[] { "2009.07.25 20:30", "Message D" },
                new String[] { "2009.07.25 20:01", "Message F" },
                new String[] { "2009.07.25 21:08", "Message E" },
                new String[] { "2009.07.25 19:54", "Message R" } };

        Arrays.sort(data, new Comparator<String[]>() {
            @Override
            public int compare(final String[] entry1, final String[] entry2) {
                final String time1 = entry1[0];
                final String time2 = entry2[0];
                return time1.compareTo(time2);
            }
        });

        for (final String[] s : data) {
            System.out.println(s[0] + " " + s[1]);
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

输出:

2009.07.25 19:54 Message R
2009.07.25 20:01 Message F
2009.07.25 20:17 Message G
2009.07.25 20:24 Message A
2009.07.25 20:25 Message B
2009.07.25 20:30 Message D
2009.07.25 21:08 Message E
Run Code Online (Sandbox Code Playgroud)

  • 简单!我尝试了它,它按预期工作 - 谢谢 - 标记为正确的答案 (2认同)
  • @Rick你只需更改`public int Compare ...`方法中的代码来指定要排序的列.`[0]`表示第一列,所以第四列使用`[3]`. (2认同)

Cos*_*atu 12

class ArrayComparator implements Comparator<Comparable[]> {
    private final int columnToSort;
    private final boolean ascending;

    public ArrayComparator(int columnToSort, boolean ascending) {
        this.columnToSort = columnToSort;
        this.ascending = ascending;
    }

    public int compare(Comparable[] c1, Comparable[] c2) {
        int cmp = c1[columnToSort].compareTo(c2[columnToSort]);
        return ascending ? cmp : -cmp;
    }
}
Run Code Online (Sandbox Code Playgroud)

这样,您可以处理这些数组中的任何类型的数据(只要它们是可比较的),并且您可以按升序或降序对任何列进行排序.

String[][] data = getData();
Arrays.sort(data, new ArrayComparator(0, true));
Run Code Online (Sandbox Code Playgroud)

PS:确保你检查ArrayIndexOutOfBounds和其他人.

编辑:上述解决方案只有在您能够java.util.Date在第一列中实际存储或者您的日期格式允许您对这些值使用纯字符串比较时才有用.否则,您需要将该String转换为Date,并且您可以使用回调接口(作为一般解决方案)来实现.这是一个增强版本:

class ArrayComparator implements Comparator<Object[]> {
    private static Converter DEFAULT_CONVERTER = new Converter() {
        @Override
        public Comparable convert(Object o) {
            // simply assume the object is Comparable
            return (Comparable) o;
        }
    };
    private final int columnToSort;
    private final boolean ascending;
    private final Converter converter;


    public ArrayComparator(int columnToSort, boolean ascending) {
        this(columnToSort, ascending, DEFAULT_CONVERTER);
    }

    public ArrayComparator(int columnToSort, boolean ascending, Converter converter) {
        this.columnToSort = columnToSort;
        this.ascending = ascending;
        this.converter = converter;
    }

    public int compare(Object[] o1, Object[] o2) {
        Comparable c1 = converter.convert(o1[columnToSort]);
        Comparable c2 = converter.convert(o2[columnToSort]);
        int cmp = c1.compareTo(c2);
        return ascending ? cmp : -cmp;
    }

}

interface Converter {
    Comparable convert(Object o);
}

class DateConverter implements Converter {
    private static final DateFormat df = new SimpleDateFormat("yyyy.MM.dd hh:mm");

    @Override
    public Comparable convert(Object o) {
        try {
            return df.parse(o.toString());
        } catch (ParseException e) {
            throw new IllegalArgumentException(e);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

此时,您可以对第一列进行排序:

Arrays.sort(data, new ArrayComparator(0, true, new DateConverter());
Run Code Online (Sandbox Code Playgroud)

我跳过了对空值和其他错误处理问题的检查.

我同意这已经开始看起来像一个框架.:)

最后(希望)编辑:我现在才意识到你的日期格式允许你使用普通的字符串比较.如果是这种情况,则不需要"增强版".


Ron*_*Ron 8

Arrays.sort(yourarray, new Comparator() {
    public int compare(Object o1, Object o2) {
        String[] elt1 = (String[])o1;
        String[] elt2 = (String[])o2;
        return elt1[0].compareTo(elt2[0]);
    }
});
Run Code Online (Sandbox Code Playgroud)

  • -1这将无法编译.应该是sort(数组,比较器). (2认同)

小智 6

  1. 安装java8 jdk + jre

  2. 使用lamda表达式2D数组进行排序.

码:

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

class SortString {

    public static void main(final String[] args) {
        final String[][] data = new String[][] {
                new String[] { "2009.07.25 20:24", "Message A" },
                new String[] { "2009.07.25 20:17", "Message G" },
                new String[] { "2009.07.25 20:25", "Message B" },
                new String[] { "2009.07.25 20:30", "Message D" },
                new String[] { "2009.07.25 20:01", "Message F" },
                new String[] { "2009.07.25 21:08", "Message E" },
                new String[] { "2009.07.25 19:54", "Message R" } 
        };
        // this is applicable only in java 8 version.
        Arrays.sort(data, (String[] s1, String[] s2) -> s1[0].compareTo(s2[0]));

        // we can also use Comparator.comparing and point to Comparable value we want to use        
        // Arrays.sort(data, Comparator.comparing(row->row[0]));

        for (final String[] s : data) {
            System.out.println(s[0] + " " + s[1]);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

产量

2009.07.25 19:54 Message R
2009.07.25 20:01 Message F
2009.07.25 20:17 Message G
2009.07.25 20:24 Message A
2009.07.25 20:25 Message B
2009.07.25 20:30 Message D
2009.07.25 21:08 Message E
Run Code Online (Sandbox Code Playgroud)


Joã*_*lva 5

假设您的数组包含字符串,您可以使用以下内容:

String[] data = new String[] { 
    "2009.07.25 20:24 Message A",
    "2009.07.25 20:17 Message G",
    "2009.07.25 20:25 Message B",
    "2009.07.25 20:30 Message D",
    "2009.07.25 20:01 Message F",
    "2009.07.25 21:08 Message E",
    "2009.07.25 19:54 Message R"
};

Arrays.sort(data, new Comparator<String>() {
    @Override
    public int compare(String s1, String s2) {
        String t1 = s1.substring(0, 16); // date/time of s1
        String t2 = s2.substring(0, 16); // date/time of s2
        return t1.compareTo(t2);
    }
});
Run Code Online (Sandbox Code Playgroud)

如果你有一个二维数组,解决方案也非常相似:

String[][] data = new String[][] { 
        { "2009.07.25 20:17", "Message G" },
        { "2009.07.25 20:25", "Message B" },
        { "2009.07.25 20:30", "Message D" },
        { "2009.07.25 20:01", "Message F" },
        { "2009.07.25 21:08", "Message E" },
        { "2009.07.25 19:54", "Message R" }
};

Arrays.sort(data, new Comparator<String[]>() {
    @Override
    public int compare(String[] s1, String[] s2) {
        String t1 = s1[0];
        String t2 = s2[0];
        return t1.compareTo(t2);
    }
});
Run Code Online (Sandbox Code Playgroud)