如何在读取文件时对ArrayList进行排序
如何在读取文件时对ArrayList进行排序
我有一个名为Fruit的类。我正在创建一个该类的列表,并向列表中添加每个水果。我想根据水果名称的顺序对该列表进行排序。
public class Fruit{ private String fruitName; private String fruitDesc; private int quantity; public String getFruitName() { return fruitName; } public void setFruitName(String fruitName) { this.fruitName = fruitName; } public String getFruitDesc() { return fruitDesc; } public void setFruitDesc(String fruitDesc) { this.fruitDesc = fruitDesc; } public int getQuantity() { return quantity; } public void setQuantity(int quantity) { this.quantity = quantity; } }
我使用for循环创建该类的列表:
Listfruits = new ArrayList (); Fruit fruit; for (int i = 0; i < 100; i++) { fruit = new Fruit(); fruit.setFruitName(...); fruits.add(fruit); }
我需要根据列表中每个对象的水果名称对这个ArrayList进行排序。如何实现?
问题出现的原因是想要在读取文件时对ArrayList进行排序。解决方法是使用Comparator来实现排序。Comparator是一个接口,可以用来定义自定义的排序规则。在这个例子中,通过比较Fruit对象的fruitName属性来排序,从而对fruits列表进行排序。
使用Comparator的代码如下:
Listfruits = new ArrayList (); Fruit fruit; for(int i = 0; i < 100; i++) { fruit = new Fruit(); fruit.setname(...); fruits.add(fruit); } // 排序 Collections.sort(fruits, new Comparator () { public int compare(Fruit fruit2, Fruit fruit1) { return fruit1.fruitName.compareTo(fruit2.fruitName); } });
这样,fruits列表就按照fruitName属性进行排序了。
另一个解决方法是让对象实现Comparable接口。通过实现Comparable接口,可以定义对象之间的默认排序规则。不同于Comparator,使用Comparable时,对象的排序规则被认为是对象本质的一部分。在这个问题中,可以让Fruit类实现Comparable接口,并在compareTo方法中定义排序规则。
对于排序的顺序,根据讨论中的回答,这里是升序排序。如果想要降序排序,可以在排序后反转列表。需要注意的是,如果水果名称区分大小写,应该使用compareToIgnoreCase而不是compareTo。
某些情况下了在Java 8之后的解决方法,可以参考链接:[stackoverflow.com/a/2784576/1372202](http://stackoverflow.com/a/2784576/1372202)
还某些情况下了使用Comparator的文档链接,可以参考:[docs.oracle.com/javase/7/docs/api/java/util/Comparator.html](https://docs.oracle.com/javase/7/docs/api/java/util/Comparator.html)。文档中说明了Comparator接口的用法和返回值的含义。
最后,有人提出了一个问题,即升序或降序取决于compare方法中对象的位置。比较fruit1和fruit2,结果将不同于比较fruit2和fruit1。
问题的原因是在读取一个文件并将其内容存储在ArrayList中时,希望能够对ArrayList进行排序。解决方法是使用Apache Commons库中的BeanComparator来实现基于类的属性的排序。
首先,需要导入org.apache.commons.beanutils.BeanComparator类。然后,创建一个BeanComparator对象,将希望排序的属性作为参数传递给它。在这个例子中,我们将使用属性"fruitName"来对ArrayList进行排序。
接下来,使用Collections.sort()方法对ArrayList进行排序。将ArrayList和创建的BeanComparator对象作为参数传递给sort()方法。这样,ArrayList中的元素将根据指定的属性进行排序。
以下是实现排序的代码示例:
import org.apache.commons.beanutils.BeanComparator; BeanComparator fieldComparator = new BeanComparator("fruitName"); Collections.sort(fruits, fieldComparator);
通过使用BeanComparator和Collections.sort()方法,我们可以在读取文件并将内容存储在ArrayList中的同时对ArrayList进行排序。这样,我们可以方便地按照特定属性对ArrayList中的元素进行排序。
如何在读取文件时对ArrayList进行排序
问题的原因:
在读取文件时,我们可能需要对ArrayList进行排序以便更好地处理数据。然而,ArrayList默认情况下是按照元素的插入顺序进行排序的,并不能满足我们的需求。
解决方法:
为Fruit类实现Comparable接口。
public class Fruit implements Comparable{ public int compareTo(Fruit fruit) { // 在这里编写按照名称比较的代码 } }
然后通过调用sort方法来对ArrayList进行排序。
Collections.sort(fruitList);
Collections.sort(..)方法也可以用于ArrayList
如果我们想要添加多个不同的排序选项,例如覆盖compareTo方法以按照对象名称进行排序,并且添加另一个按照年龄、产品ID等排序的选项,我们可以采用以下方法。
我们可以编写多个Comparators,并在适当的位置插入正确的Comparator。例如,按照对象名称进行排序的Comparator可以这样写:
Comparator comp1 = new Comparator() { @Override public int compare(Fruit fruit2, Fruit fruit1) { return fruit1.fruitName.compareTo(fruit2.fruitName); } }); Collections.sort(fruitList, comp1);
通过编写不同的Comparator,我们可以在需要时选择不同的排序选项,并对ArrayList进行排序,以满足我们的需求。