排序不同数据类型的数组

时间:2018-03-15 12:31:42

标签: java arrays

我有一个对象数组,每个对象包含一个字符串,double和整数,用于数组中的每个对象。我想知道如何按字母顺序按第一个值(字符串)对此数组进行排序。

我尝试了Arrays.sort(data)但我收到了一个错误,因为我认为它在达到双倍时会停止。

  

线程中的异常" AWT-EventQueue-0" java.lang.ClassCastException:java.lang.String无法强制转换为java.lang.Double       在java.lang.Double.compareTo(Double.java:49)

这是我的代码:

for (int i = 0; i < Database.getStockArray().size(); i++) {

        String item = Database.getStockArray().get(i).getItem();
        double price = Database.getStockArray().get(i).getPrice();
        int quantity = Database.getStockArray().get(i).getQuantity();


        Object[] data = {item, price, quantity};

        model.addRow(data);
}

5 个答案:

答案 0 :(得分:0)

doubleint转换为String,例如

String p = Double.toString(price);
String q = Integer.toString(quantity);

然后您可以将所有值排序为字符串。

答案 1 :(得分:0)

你将两种不同的东西混合在一起:

  1. 您的三元数组项目,价格和数量实际上是一个记录(结构,对象),应该作为类实现。对记录成员进行排序是无稽之谈。

  2. 然后,您可以使用Comparator.comparing(Data::getItem)对此类实例的集合或数组进行排序(假设您将类命名为Data)。如果你真的想把你的记录表示为数组,我认为这很难看,请使用Comparator.comparing((Data data) -> data[0])

答案 2 :(得分:0)

  

我想知道如何按字母顺序按第一个值(字符串)对此数组进行排序。

您需要定义一个比较器,使用第一个单元格对特定对象数组进行排序,将其强制转换为字符串,并简单地与这些值进行比较。 (如果发生这种情况,您可能需要管理null

    new Comparator<Object[]>() {
        @Override
        public int compare(Object[] o1, Object[] o2) {
            String s1 = (String) o1[0];
            String s2 = (String) o2[0];
            return s1.compareTo(s2);
        }
    };

这可以通过以下方式验证:

    List<Object[]> list = new ArrayList<>();
    list.add(new Object[] { "b", 5 });
    list.add(new Object[] { "a", 42 });
    list.add(new Object[] { "c", 12 });

    Collections.sort(list, new Comparator<Object[]>() {
        @Override
        public int compare(Object[] o1, Object[] o2) {
            String s1 = (String) o1[0];
            String s2 = (String) o2[0];
            return s1.compareTo(s2);
        }
    });

    //To print each array in the order
    list.stream().map(Arrays::toString).forEach(System.out::println);
  

[a,42]

     

[b,5]

     

[c,12]

答案 3 :(得分:0)

根据您的代码,我将做出以下假设:

你有一个对象列表,以某种方式看起来:

class StockItem {
    private final String item;
    private final double price;
    private final int quantity;

    StockItem(String item, double price, int quantity) {
        this.item = item;
        this.price = price;
        this.quantity = quantity;
    }

    public String getItem() {
        return item;
    }

    public double getPrice() {
        return price;
    }

    public int getQuantity() {
        return quantity;
    }
}

您正试图将它们放入DefaultTableModel

您需要做的是首先对列表中的元素进行排序,然后您可以迭代它,为每个项目创建Object[]并将其添加到模型中:

List<StockItem> stockArray = Arrays.asList(
    new StockItem("foo", 7.99, 47),
    new StockItem("bar", 4.59, 12),
    new StockItem("baz", 0.98, 1057)); // Database.getStockArray();

// 1.
Collections.sort(stockArray, Comparator.comparing(StockItem::getItem));    

DefaultTableModel model = new DefaultTableModel();

// 2.
for (StockItem e : stockArray) {
    model.addRow(new Object[] {
         e.getItem(), e.getPrice(), e.getQuantity()
    });
}

或者如果您更喜欢使用流:

stockArray.stream()
    .sorted(Comparator.comparing(StockItem::getItem))
    .map(e -> new Object[] {e.getItem(), e.getPrice(), e.getQuantity()})
    .forEach(model::addRow);

答案 4 :(得分:-2)

如果你想基于对象属性进行排序,那么正确的方法是通过Comparator接口和Collections.sort()进行排序。

相关问题