ArrayList
を使用してComparator
を昇順で並べ替える方法は?私はそれを降順でソートする方法を知っています:
Comparator mycomparator = Collections.reverseOrder();
その後
Collections.sort(myarrayList,mycomparator);
コレクションとコンパレータを使用して昇順で並べ替える方法を知りたいだけですか?ありがとう!
これを捨てるだけです...あなたはただすることはできません:
Collections.sort(myarrayList);
久しぶりですが...
デフォルトバージョンを使用します。
Collections.sort(myarrayList);
もちろん、これにはElementsがComparable
を実装する必要がありますが、同じことがあなたが言及したバージョンにも当てはまります。
ところで:コードでジェネリックスを使用する必要があります。そうすれば、クラスがComparableを実装していない場合にコンパイル時エラーが発生します。また、コンパイル時のエラーは、そうでない場合に発生するランタイムエラーよりもはるかに優れています。
List<MyClass> list = new ArrayList<MyClass>();
// now fill up the list
// compile error here unless MyClass implements Comparable
Collections.sort(list);
値で並べ替え
public Map sortByValue(Map map, final boolean ascending) {
Map result = new LinkedHashMap();
try {
List list = new LinkedList(map.entrySet());
Collections.sort(list, new Comparator() {
@Override
public int compare(Object object1, Object object2) {
if (ascending)
return ((Comparable) ((Map.Entry) (object1)).getValue())
.compareTo(((Map.Entry) (object2)).getValue());
else
return ((Comparable) ((Map.Entry) (object2)).getValue())
.compareTo(((Map.Entry) (object1)).getValue());
}
});
for (Iterator it = list.iterator(); it.hasNext();) {
Map.Entry entry = (Map.Entry) it.next();
result.put(entry.getKey(), entry.getValue());
}
} catch (Exception e) {
Log.e("Error", e.getMessage());
}
return result;
}
ここに完全な例があります:
次のようなPersonクラスがあるとします。
public class Person
{
protected String fname;
protected String lname;
public Person()
{
}
public Person(String fname, String lname)
{
this.fname = fname;
this.lname = lname;
}
public boolean equals(Object objet)
{
if(objet instanceof Person)
{
Person p = (Person) objet;
return (p.getFname().equals(this.fname)) && p.getLname().equals(this.lname));
}
else return super.equals(objet);
}
@Override
public String toString()
{
return "Person(fname : " + getFname + ", lname : " + getLname + ")";
}
/** Getters and Setters **/
}
次に、コンパレータを作成します。
import Java.util.Comparator;
public class ComparePerson implements Comparator<Person>
{
@Override
public int compare(Person p1, Person p2)
{
if(p1.getFname().equalsIgnoreCase(p2.getFname()))
{
return p1.getLname().compareTo(p2.getLname());
}
return p1.getFname().compareTo(p2.getFname());
}
}
最後に、人のグループがあるとします。
import Java.util.ArrayList;
import Java.util.Collections;
import Java.util.Comparator;
import Java.util.List;
public class Group
{
protected List<Person> listPersons;
public Group()
{
this.listPersons = new ArrayList<Person>();
}
public Group(List<Person> listPersons)
{
this.listPersons = listPersons;
}
public void order(boolean asc)
{
Comparator<Person> comp = asc ? new ComparePerson() : Collections.reverseOrder(new ComparePerson());
Collections.sort(this.listPersons, comp);
}
public void display()
{
for(Person p : this.listPersons)
{
System.out.println(p);
}
}
/** Getters and Setters **/
}
今、私たちはこれを試します:
import Java.util.ArrayList;
import Java.util.List;
public class App
{
public static void main(String[] args)
{
Group g = new Group();
List listPersons = new ArrayList<Person>();
g.setListPersons(listPersons);
Person p;
p = new Person("A", "B");
listPersons.add(p);
p = new Person("C", "D");
listPersons.add(p);
/** you can add Person as many as you want **/
g.display();
g.order(true);
g.display();
g.order(false);
g.display();
}
}
これはうまくいくかもしれませんか?
Comparator mycomparator =
Collections.reverseOrder(Collections.reverseOrder());
これを行う2つの方法:
Collections.sort(myArray)
myArray内の指定された要素はComparableを実装します
2番目
Collections.sort(myArray, new MyArrayElementComparator());
ここで、MyArrayElementComparator
はmyArray内の要素のComparator
です。