在java中sortingstring的二维数组
我知道这个问题以前可能有人问过,但是我找不到合适的答案。 所以说我有这个数组:
String [][] theArray = {{"james", "30.0"},{"joyce", "35.0"},{"frank", "3.0"}, {"zach", "34.0"}}
有没有办法按每个子元素的第二个元素递减sorting该数组。 所以我会得到这样的东西。
theArray = {{"joyce", "35.0"},{"zach", "34.0"},{"james", "30.0"}, {"frank", "3.0"}}
多谢你们
您必须使用Arrays.sort()方法 。 这个方法使用比较器作为参数。 sort方法委托给比较器来确定数组中的一个元素是否必须被视为更大,更小或等于另一个元素。 由于外部数组的每个元素都是一个数组,因此比较器将不得不比较(string的)数组。
数组必须根据第二个元素的值进行比较。 这第二个元素是一个string,实际上是一个双数字。 所以你必须将string转换为数字,否则顺序将是字典(20来3),而不是数字。
比较器可能看起来像这样:
public class StrinArrayComparator implements Comparator<String[]> { @Override public int compare(String[] array1, String[] array2) { // get the second element of each array, andtransform it into a Double Double d1 = Double.valueOf(array1.[1]); Double d2 = Double.valueOf(array2.[1]); // since you want a descending order, you need to negate the // comparison of the double return -d1.compareTo(d2); // or : return d2.compareTo(d1); } }
使用Arrays.sort(arr, comparator)
和自定义比较器:
Arrays.sort(theArray, new Comparator<String[]>(){ @Override public int compare(final String[] first, final String[] second){ // here you should usually check that first and second // a) are not null and b) have at least two items // updated after comments: comparing Double, not Strings // makes more sense, thanks Bart Kiers return Double.valueOf(second[1]).compareTo( Double.valueOf(first[1]) ); } }); System.out.println(Arrays.deepToString(theArray));
输出:
[[joyce,35.0],[zach,34.0],[james,30.0],[frank,23.0]]
谨防:
你将会对你传入的数组进行sorting, Arrays.sort()
不会返回一个新的数组(实际上它将返回void)。 如果你想要一个sorting的副本,请这样做:
String[][] theCopy = Arrays.copyOf(theArray, theArray.length);
并在theCopy
上执行sorting,而不是theCopy
。
如果你想离开数组,这是一个使用List<Record>
和implements Comparator<Record>
的RecordComparator
的变体。
安慰:
joyce 35.0 zach 34.0 詹姆斯30.0 坦率23.0
码:
import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Comparator; import java.util.List; /** @see http://stackoverflow.com/questions/5064027 */ public class ComparatorTest { public static void main(String[] args) { List<Record> list = new ArrayList<Record>(Arrays.asList( new Record("james", "30.0"), new Record("joyce", "35.0"), new Record("frank", "23.0"), new Record("zach", "34.0"))); print(list, Sort.DESCENDING, Field.D); } private static void print(List<Record> list, Sort s, Field f) { RecordComparator rc = new RecordComparator(s, f); Collections.sort(list, rc); for (Record r : list) { System.out.println(r); } } } class Record { private String s; private Double d; public Record(String name, String number) { this.s = name; this.d = Double.valueOf(number); } @Override public String toString() { return s + " " + d; } public int compareTo(Field field, Record record) { switch (field) { case S: return this.s.compareTo(record.s); case D: return this.d.compareTo(record.d); default: throw new IllegalArgumentException( "Unable to sort Records by " + field.getType()); } } } enum Sort { ASCENDING, DESCENDING; } enum Field { S(String.class), D(Double.class); private Class type; Field(Class<? extends Comparable> type) { this.type = type; } public Class getType() { return type; } } class RecordComparator implements Comparator<Record> { private Field field; private Sort sort; public RecordComparator(Sort sort, Field field) { this.sort = sort; this.field = field; } @Override public final int compare(Record a, Record b) { int result = a.compareTo(field, b); if (sort == Sort.ASCENDING) return result; else return -result; } }
你似乎生活在对象否认中 。 这些内部数组看起来很像一个人的信息(名字和一些值,也许是一个分数)。
你想要做的是写一个自定义的类来保存这些信息:
public class Person { private final String name; private final double score; public Person(final String name, final double score) { this.name=name; this.score=score; } public String getName() { return name; } public double getScore() { return score; } }
然后,当你想对它们进行sorting的时候,你只需要实现一个Comparator<Person>
来指定你想要sorting的方式:
public PersonScoreComparator implements Comparator<Person> { public int compare(Person p1, Person p2) { return Double.compare(p1.getScore(), p2.getScore()); } }
或者,你可以通过添加这个方法来让Person
类本身实现Comparable<Person>
:
public int compareTo(Person other) { return Double.compare(getScore(), other.getScore()); }
– 使用Arrays.toList()创build此数组的列表 – 使用java.lang.comparatordevise比较器并编写用于对每个偶数元素进行sorting的逻辑
java.util.Arrays
有几种sorting方法。 其中两个采取自定义Comparator
。 只需提供一个比较内部数组的第二个元素的比较器即可。
也许这个链接帮助我如何sorting在Java中包含数字的string
public static void main(String [] args){
String Name[][]={{"prakash","kumar"},{"raj","kappor"},{"vinod","bhart"}}; String str[]=new String[2]; for(int j=0; j<Name.length;j++) { for (int i=0 ; i<2; i++) { str[i]=Name[j][i]; } for(int i=0;i<str.length;i++) { for(int k=i+1;k<str.length;k++) { if(str[i].compareTo(str[k])>0) { String temp= str[i]; str[i]=str[k]; str[k]=temp; } } System.out.print(str[i]+ " "); } System.out.println(); } } }
/** * * @param array - 2D array required to be arranged by certain column * @param columnIndex - starts from 0; this will be the main comparator * @param hasHeaders - true/false; true - ignore the first row. False - * first row it's also compared and arranged * @return - the new arranged array */ private String[][] arrangeArray(String[][] array, int columnIndex, boolean hasHeaders) { int headersExists = 0; if (hasHeaders) { headersExists = 1; } for (int i = headersExists; i < array.length; i++) { for (int j = headersExists; j < array.length; j++) { if (array[i][columnIndex].compareTo(array[j][columnIndex]) < 0){ String[] temp = array[i]; array[i] = array[j]; array[j] = temp; } } } return array; }