【问题标题】:Sorting Lines Based on words in them as keys根据其中的单词作为键对行进行排序
【发布时间】:2011-12-20 08:44:34
【问题描述】:
 Odrer     ID    Descrption    Type 

Envelope  K205    Green       Paper     >>>>String Line with space in between
Box       J556    Yellow      Thermocol >>>>String Line with space in between
Envelope  L142    White       Plastic   >>>>String Line with space in between

我有一个类似上面的表格,我必须提供选项排序 基于列名的数据,例如“按顺序排序”、“按类型排序”之类的 请建议我在Java中实现这一目标的最佳想法......表格行是字符串 空间分隔每个 touple..

【问题讨论】:

  • 信息是来自 SQL 数据库,还是来自文件(文本或 CSV)?
  • 你说的表,是指数据存储在数据库中吗?如果是这样,您应该让数据库对您的列进行排序。否则,您应该创建一个List 的表数据对象并使用Comparator 对列表进行排序。
  • 不,它只是由扫描程序类读取,并按顺序排列,因为只有用户需要排序......而不是在数据库中......

标签: java sorting


【解决方案1】:

将表中的每一行表示为具有 order、id、description 和 type 属性的对象。将每个对象添加到一个集合中,例如一个列表。然后,您可以创建不同的比较器,例如 OrderComparatorTypeComparator,以分别根据顺序或类型对集合进行排序。

例如,您的数据类可能如下所示:

public class Data{
    private final String order;
    private final String id;
    private final String description;
    private final String type;

    public Data(String order, String id, String description, String type) {
        this.order=order;
        this.id=id;
        this.description=description;
        this.type=type;
    }

    /** getter methods here **/
}

现在,您可以将它们添加到列表中并使用特定的比较器对其进行排序:

//add data to a list
List<Data> list = new ArrayList<Data>();
list.add(new Data("Envelope","K205","Green","Paper"));
list.add(new Data("Box","J556","Yellow","Thermocol"));
list.add(new Data("Envelope","L142","White","Plastic"));

//create a comparator to sort by type
Comparator<Data> typeComparator = new Comparator<Data>() {
    @Override
    public int compare(Data o1, Data o2) {
        return o1.getType().compareTo(o2.getType());
    }
};

//sort the list
Collections.sort(list, typeComparator);

【讨论】:

    【解决方案2】:

    您必须开发您的自定义比较器。例如如下所示。

    class ColumnComparator implements Comparator<String> {
        private int column;
        ColumnComparator(int column) {
             this.column = column;
        }
        public int compare(String s1, String s2) {
            return getColumn(s1).compareTo(getColumn(s2));
        }
        private String getColumn(String line) {
            return line.split("\\s+")[column];
        }
    

    然后您可以使用Arrays.sort()Collections.sort() 传递您的行的数组或集合以及此比较器的实例。我留给您实现按列名查找列索引的逻辑。

    }
    

    【讨论】:

      【解决方案3】:

      可能的方法概述(假设数据不是来自数据库):

      1. 将您的数据表示为具有适当字段的类:

        class YourData {
            private final String Order;
            private final String Id;
            private final String Description;
            private final String Type;
        
            // add getters, setters and appropriate constructors
        }
        

        使用适当的数据类型。您可以使用Scanner 来解析数据。

      2. 为您要排序的每个属性写一个Comparator。如果要颠倒排序,可以使用Collections.reverseOrder

      3. 将您的数据放入ArrayList,并使用Collections.sort 和适当的Comparator 来实现所需的排序。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-05
        • 2011-12-11
        • 2013-03-27
        • 2014-01-14
        • 1970-01-01
        相关资源
        最近更新 更多