要求:
Add a new method sort(String columnName,boolean order) to WMDataSet.
This method should efficiently sort the rows by the column name passed and in the specified order (ascending\descending)import java.util.ArrayList;
import java.util.List;public class WMDataSet 
{
private List<List<Object>> rows;
private List<String> colNames;

public WMDataSet()
{
this.rows = new ArrayList<List<Object>>();
this.colNames = new ArrayList<String>();
}
public WMDataSet(String [] colNames)
{
this();
for (String colName : colNames)
{
this.colNames.add(colName);
}
}
public List<List<Object>> getRows() 
{
return rows;
}
public List<String> getColNames() 
{
return colNames;
}

public void clear ()
{
for (List<Object> row : rows)
{
row.clear();
}
rows.clear();
colNames.clear();
}

public void sort(String columnName,boolean order)
{
//TODO
                  //Logic is here
}
}满分奉上。3ks all!

解决方案 »

  1.   

    The class WMDataSet is used to hold the data rows which needs to be converted into response for webservices. The requirement is to be able to sort the rows in WMDataSet on a specified column.加上一点点
      

  2.   

    为了排序你必须要保证
        private List<List<Object>> rows;
        private List<String> colNames;
    这两个的一一对应,
    可以考虑以这两个生成个HashMap<String, List<Object>>然后以colNames排序后,数组化,直接用Arrays.sort()方法排序
    再把以前数据先clear掉,再依次(就是排好序的数组)从HashMap中加入到 rows和colNames中
      

  3.   

        public void sort(String columnName,boolean order) {
         for (int i=0;i<colNames.size();i++) {
         //找到columnName是哪一列
         if (columnName.equals(colNames.get(i))) {
              //根据你有多少行数据初始化一个排序用数组
         Object[] datas = new Object[rows.size()];
         HashMap<Object, List<Object>> map = new HashMap<Object, List<Object>>();
         for (int j=0;j<rows.size();j++) {
         map.put(rows.get(j).get(i), rows.get(j));
         //map里的key是每一行需要排序列的对象,value是每一行的数据
         datas[j] = rows.get(j).get(i);
         }
         Arrays.sort(datas);
                 rows.clear();
                 if (order) {//升序
                 for (int j=0;j<datas.length;j++) {
                 rows.add(map.get(datas[j]));
                 }
                 } else {//降序
                 for (int j=datas.length-1;j>=0;j--) {
                 rows.add(map.get(datas[j]));
                 }
                 }
             break;
         }
         }
        }
      

  4.   

    还有一段完整的测试代码import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Random;public class WMDataSet 
    {
        private List<List<Object>> rows;
        private List<String> colNames;
        
        public WMDataSet()
        {
            this.rows = new ArrayList<List<Object>>(0);
            this.colNames = new ArrayList<String>(0);
        }
        
        public WMDataSet(String [] colNames)
        {
            this();
            for (String colName : colNames)
            {
                this.colNames.add(colName);
            }
        }
        
        public List<List<Object>> getRows() 
        {
            return rows;
        }
        
        public List<String> getColNames() 
        {
            return colNames;
        }    
        
        public void clear ()
        {
            for (List<Object> row : rows)
            {
                row.clear();
            }
            rows.clear();
            colNames.clear();
        }
        
        public void sort(String columnName,boolean order) {
         for (int i=0;i<colNames.size();i++) {
         //找到columnName是哪一列
         if (columnName.equals(colNames.get(i))) {
              //根据你有多少行数据初始化一个排序用数组
         Object[] datas = new Object[rows.size()];
         HashMap<Object, List<Object>> map = new HashMap<Object, List<Object>>();
         for (int j=0;j<rows.size();j++) {
         map.put(rows.get(j).get(i), rows.get(j));
         //map里的key是每一行需要排序列的对象,value是每一行的数据
         datas[j] = rows.get(j).get(i);
         }
         Arrays.sort(datas);
                 rows.clear();
                 if (order) {//升序
                 for (int j=0;j<datas.length;j++) {
                 rows.add(map.get(datas[j]));
                 }
                 } else {//降序
                 for (int j=datas.length-1;j>=0;j--) {
                 rows.add(map.get(datas[j]));
                 }
                 }
             break;
         }
         }
        }
        
        public void show() {
         System.out.println("-----------------------------------");
         for (String name : colNames) {
             System.out.print(" " + name + " ");
         }
         System.out.println();
         for (List<Object> row : rows) {
         System.out.println(row);
         }
        }
        
        public static void main(String[] args) {
         //制造一些数据进行测试
         int row = 5;
         int col = 10;
         WMDataSet data = new WMDataSet();
         List<Object> newData;
         Random ran = new Random();
         for (int i=0;i<col;i++) {
             data.getColNames().add("col"+i);
         }
         for (int i=0;i<row;i++) {
         newData = new ArrayList<Object>();
         for (int j=0;j<col;j++) {
         newData.add("cr" + (ran.nextInt(90)+10));
         }
         data.getRows().add(newData);
         }
         data.show();
         data.sort("col3", true);
         data.show();
         data.sort("col5", false);
         data.show();
        }
    }
      

  5.   

    看看这儿吧, 实现Comparable接口试试.
    http://gaojiewyh.javaeye.com/blog/405514
      

  6.   

    hashMap有缺陷,我又换个算法,这下没问题了import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;
    import java.util.Random;public class WMDataSet 
    {
        private List<List<Object>> rows;
        private List<String> colNames;
        
        public WMDataSet()
        {
            this.rows = new ArrayList<List<Object>>(0);
            this.colNames = new ArrayList<String>(0);
        }
        
        public WMDataSet(String [] colNames)
        {
            this();
            for (String colName : colNames)
            {
                this.colNames.add(colName);
            }
        }
        
        public List<List<Object>> getRows() 
        {
            return rows;
        }
        
        public List<String> getColNames() 
        {
            return colNames;
        }    
        
        public void clear ()
        {
            for (List<Object> row : rows)
            {
                row.clear();
            }
            rows.clear();
            colNames.clear();
        }
        
        public void sort(String columnName,boolean order) {
         for (int i=0;i<colNames.size();i++) {
         //找到columnName是哪一列
         if (columnName.equals(colNames.get(i))) {
              //根据你有多少行数据初始化一个排序用数组
         Object[] datas = new Object[rows.size()];
         ArrayList<List<Object>> oldrows = new ArrayList<List<Object>>(0);
         oldrows.addAll(rows);
         for (int j=0;j<rows.size();j++) {
         datas[j] = rows.get(j).get(i);
         }
         Arrays.sort(datas);
                 rows.clear();
                 if (order) {//升序
                 for (int j=0;j<datas.length;j++) {
                 for (List<Object> row : oldrows) {
                 if (row.get(i).equals(datas[j])) {
                 rows.add(row);
                 oldrows.remove(row);
                 break;
                 }
                 }
                 }
                 } else {//降序
                 for (int j=datas.length-1;j>=0;j--) {
                 for (List<Object> row : oldrows) {
                 if (row.get(i).equals(datas[j])) {
                 rows.add(row);
                 oldrows.remove(row);
                 break;
                 }
                 }
                 }
                 }
             break;
         }
         }
        }
        
        public void show() {
         System.out.println("-----------------------------------");
         for (String name : colNames) {
             System.out.print(" " + name + " ");
         }
         System.out.println();
         for (List<Object> row : rows) {
         System.out.println(row);
         }
        }
        
        public static void main(String[] args) {
         //制造一些数据进行测试
         int row = 5;
         int col = 10;
         WMDataSet data = new WMDataSet();
         List<Object> newData;
         Random ran = new Random();
         for (int i=0;i<col;i++) {
             data.getColNames().add("col"+i);
         }
         for (int i=0;i<row;i++) {
         newData = new ArrayList<Object>();
         for (int j=0;j<col;j++) {
         newData.add("cr" + (ran.nextInt(90)+10));
         }
         data.getRows().add(newData);
         }
         data.show();
         data.sort("col3", true);
         data.show();
         data.sort("col5", false);
         data.show();
        }
    }