我有一个对象数组,每个对象包含一个字符串,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);
}
答案 0 :(得分:0)
将double
和int
转换为String
,例如
String p = Double.toString(price);
String q = Integer.toString(quantity);
然后您可以将所有值排序为字符串。
答案 1 :(得分:0)
你将两种不同的东西混合在一起:
您的三元数组项目,价格和数量实际上是一个记录(结构,对象),应该作为类实现。对记录成员进行排序是无稽之谈。
然后,您可以使用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()进行排序。