web-dev-qa-db-ja.com

Javaでオブジェクトの配列をソートする方法は?

私の配列には文字列が含まれていません。ただし、オブジェクト参照は含まれます。すべてのオブジェクト参照は、toStringメソッドによって名前、ID、作成者、発行者を返します。

public String toString() {
        return (name + "\n" + id + "\n" + author + "\n" + publisher + "\n");
}

次に、オブジェクトの配列を名前でソートする必要があります。並べ替えの方法は知っていますが、オブジェクトから名前を抽出して並べ替える方法はわかりません。

31
Tushar Monirul

それには2つの方法があり、どちらも Arrays ユーティリティクラスを使用します

  1. Comparator を実装し、コンパレータと一緒に配列を sortメソッド に渡します。これは2番目のパラメーターとして受け取ります。
  2. Comparable インターフェースをオブジェクトのクラスに実装し、配列を sortメソッド に渡します。このパラメーターは1つのパラメーターのみを取ります。

class Book implements Comparable<Book> {
    public String name, id, author, publisher;
    public Book(String name, String id, String author, String publisher) {
        this.name = name;
        this.id = id;
        this.author = author;
        this.publisher = publisher;
    }
    public String toString() {
        return ("(" + name + ", " + id + ", " + author + ", " + publisher + ")");
    }
    @Override
    public int compareTo(Book o) {
        // usually toString should not be used,
        // instead one of the attributes or more in a comparator chain
        return toString().compareTo(o.toString());
    }
}

@Test
public void sortBooks() {
    Book[] books = {
            new Book("foo", "1", "author1", "pub1"),
            new Book("bar", "2", "author2", "pub2")
    };

    // 1. sort using Comparable
    Arrays.sort(books);
    System.out.println(Arrays.asList(books));

    // 2. sort using comparator: sort by id
    Arrays.sort(books, new Comparator<Book>() {
        @Override
        public int compare(Book o1, Book o2) {
            return o1.id.compareTo(o2.id);
        }
    });
    System.out.println(Arrays.asList(books));
}

出力

[(bar, 2, author2, pub2), (foo, 1, author1, pub1)]
[(foo, 1, author1, pub1), (bar, 2, author2, pub2)]
31
A4L

次のようなものを試すことができます:

List<Book> books = new ArrayList<Book>();

Collections.sort(books, new Comparator<Book>(){

  public int compare(Book o1, Book o2)
  {
     return o1.name.compareTo(o2.name);
  }
});
37
zbess

Java 8


lambda式 の使用

Arrays.sort(myTypes, (a,b) -> a.name.compareTo(b.name));

Test.Java

public class Test {

    public static void main(String[] args) {

        MyType[] myTypes = {
                new MyType("John", 2, "author1", "publisher1"),
                new MyType("Marry", 298, "author2", "publisher2"),
                new MyType("David", 3, "author3", "publisher3"),
        };

        System.out.println("--- before");
        System.out.println(Arrays.asList(myTypes));
        Arrays.sort(myTypes, (a, b) -> a.name.compareTo(b.name));
        System.out.println("--- after");
        System.out.println(Arrays.asList(myTypes));

    }

}

MyType.Java

public class MyType {

    public String name;
    public int id;
    public String author;
    public String publisher;

    public MyType(String name, int id, String author, String publisher) {
        this.name = name;
        this.id = id;
        this.author = author;
        this.publisher = publisher;
    }

    @Override
    public String toString() {
        return "MyType{" +
                "name=" + name + '\'' +
                ", id=" + id +
                ", author='" + author + '\'' +
                ", publisher='" + publisher + '\'' +
                '}' + System.getProperty("line.separator");
    }
}

出力:

--- before
[MyType{name=John', id=2, author='author1', publisher='publisher1'}
, MyType{name=Marry', id=298, author='author2', publisher='publisher2'}
, MyType{name=David', id=3, author='author3', publisher='publisher3'}
]
--- after
[MyType{name=David', id=3, author='author3', publisher='publisher3'}
, MyType{name=John', id=2, author='author1', publisher='publisher1'}
, MyType{name=Marry', id=298, author='author2', publisher='publisher2'}
]

メソッド参照 の使用

Arrays.sort(myTypes, MyType::compareThem);

compareThemMyType.Javaに追加する必要があります。

public static int compareThem(MyType a, MyType b) {
    return a.name.compareTo(b.name);
}
23

Java 8コンストラクトの更新

Bookフィールドゲッターを持つnameクラスを想定すると、Arrays.sortメソッドは、Java 8コンストラクトを使用して指定された追加のComparatorを渡すことにより、- コンパレーターのデフォルトメソッドメソッド参照

Arrays.sort(bookArray, Comparator.comparing(Book::getName));

また、thenComparingメソッドを使用して複数のフィールドで比較することもできます。

Arrays.sort(bookArray, Comparator.comparing(Book::getName)
      .thenComparing(Book::getAuthor))
      .thenComparingInt(Book::getId));
7
shriyog

Java 8参照メソッドの使用

compareメソッドをBookクラスに追加できます

class Book {
     public static int compare(Book a , Book b)
     {
         return a.name.compareTo(b.name);
     }
}

そして、あなたはこれを行うことができます:

Arrays.sort(books , Book::compare);

ここに完全な例があります:

static class Book {
    String name;
    String author;

    public Book(String name, String author) {
        this.name = name;
        this.author = author;
    }

    public static int compareBooks(Book a , Book b)
    {
        return a.name.compareTo(b.name);
    }

    @Override
    public String toString() {
        return "name : " + name + "\t" + "author : " + author;
    }
}


public static void main(String[] args) {

    Book[] books = {
            new Book("Book 3" , "Author 1"),
            new Book("Book 2" , "Author 2"),
            new Book("Book 1" , "Author 3"),
            new Book("Book 4" , "Author 4")
    };

    Arrays.sort(books , Book::compareBooks);
    Arrays.asList(books).forEach(System.out::println);

}
1
Ali

オブジェクトを比較するクラスに「比較可能」インターフェースを実装できます。

また、その中に「compareTo」メソッドも実装します。

ArrayListにクラスのインスタンスを追加します

次に、「Java.utils.Collections.sort()」メソッドが必要な魔法を行います。

これは、--->( https://deva-codes.herokuapp.com/CompareOnTwoKeys )オブジェクトが最初にIDで、次に名前で2つのキーに基づいてソートされる実際の例です。

Arrays.sort(yourList,new Comparator<YourObject>() {

    @Override
    public int compare(YourObjecto1, YourObjecto2) {
        return compare(o1.getYourColumn(), o2.getYourColumn());
    }
});
0
Mehmet Onar

オブジェクトの配列を任意の値でソートしたい場合があります。 compareTo()は常にインスタンスに関する同じ情報を使用するため、別の手法を使用することもできます。 1つの方法は、標準のソートアルゴリズムを使用することです。書籍の配列があり、それらを高さでソートするとします。これはintとして保存され、getHeight()メソッドでアクセスできます。配列内の書籍を並べ替える方法は次のとおりです。 (元の配列を変更したくない場合は、単にコピーを作成して並べ替えます。)

`int tallest; // the index of tallest book found thus far
 Book temp; // used in the swap
 for(int a = 0; a < booksArray.length - 1; a++) {
   tallest = a; // reset tallest to current index
   // start inner loop at next index
   for(int b = a + 1; b < booksArray.length; b++)
     // check if the book at this index is taller than the
     // tallest found thus far
     if(booksArray[b].getHeight() > booksArray[tallest].getHeight())
       tallest = b;
   // once inner loop is complete, swap the tallest book found with
   // the one at the current index of the outer loop
   temp = booksArray[a];
   booksArray[a] = booksArray[tallest];
   booksArray[tallest] = temp;
 }`

このコードが完了すると、ブックオブジェクトの配列は、インテリアデザイナーの夢である高さの降順でソートされます!

0
Stephen Barner