簡體   English   中英

根據對象的字符串字段對ArrayList中的對象進行排序

[英]Sorting objects in an ArrayList based on their String field

伙計們! 我正在為uni進行課程學習,但遇到了一些困難。 我有一個類的層次結構和一個ArrayList,其中存儲了這些類的對象。 我的代碼打印出存儲在ArrayList中的對象的詳細信息,但是我必須根據String字段將其打印出來,但我不知道該怎么做。 我需要根據LibraryItem類中的標題字段打印詳細信息,並且指定需要使用Java類庫。 我瀏覽了一些內容,並根據所看到的內容猜測是否需要使用Comparable,但我不知道它的工作原理……這是代碼的一部分:

public class LibraryItem {

        private String title;
        private String itemCode;
        private int timesBorrowed;

...


public void printDetails()
        {
            System.out.println("\nTitle: " + title);
            System.out.println("Item code: " + itemCode);
            System.out.println("Cost: " + cost);
            System.out.println("Times borrowed: " + timesBorrowed);
            System.out.println("On loan: " + onLoan);
        }
}

...

public abstract class AudioVisual extends LibraryItem{

    private int playingTime;

    public AudioVisual()
    {
        super();
        playingTime = 80;
    }

public void printDetails()
    {
        super.printDetails();
        System.out.println("Playing time: " + playingTime);
    }

...

public class CD extends AudioVisual{

    private String artist;
    private int noOfTracks;

    public CD()
    {
        super();
        artist = "The Animals";
        noOfTracks = 9;
    }
public void printDetails()
{
    super.printDetails();
    System.out.println("Artist: " + artist);
    System.out.println("Number of tracks: " + noOfTracks);
}

...

public class DVD extends AudioVisual{

    private String director;

    public DVD()
    {
        director = "Director1";
    }
public void printDetails()
    {
        super.printDetails();
        System.out.println("Director: " + director);
    }

...

public class Library
{
    private ArrayList<LibraryItem> itemList;

    public Library()
    {
        itemList = new ArrayList<LibraryItem>();
    }

    public void printAllDetails()
    {
        for (LibraryItem item: itemList)
        {
            item.printDetails();
        }
    }

再次將CD和DVD對象添加到ArrayList中。 先感謝您!

Collections.sort上有一個需要Comparator的重載,您可以使用它,

 Collection.sort(items, new Comparator<LibraryItem>{
  @Override
  public int compare(LibraryItem a, LibraryItem b) {
    return a.title.compareTo(b.title);
  }
}

如果您使用的是Java 8,那么使用lambdas的版本就不那么冗長了。

Collections.sort(items,(item1,item2) -> item1.title.compareTo(item2.title));

您可以通過兩種方式進行操作:

  1. 使用Comparable接口,該接口將由LibraryItems類通過實現compareTo方法來實現。
  2. 使用Comparator接口(將是一個單獨的類)並實現compare方法。

無論選擇哪種方式,您的實現都將如下所示:

public int compare(LibraryItem item1, LibraryItem item2) {//if you are implementing Comparator
     return item1.getTitle().compareTo(item2.getTitle());//if you want to sort item by title
}

然后在打印列表之前,可以對它們進行排序:

Collections.sort(itemList, <comparator object>);//if using comparator or you could omit passing comparator object.
//iterate and print items

流方式(原始收藏未觸及)

    itemList.stream()
            .sorted(Comparator.comparing(LibraryItem::getTitle))
            .forEachOrdered(LibraryItem::printDetails);

收集到位(即有副作用)

    Collections.sort(itemList, Comparator.comparing(LibraryItem::getTitle));
    for (LibraryItem item : itemList) {
        item.printDetails();
    }

employee.stream()。collect(Collectors.summingInt(Employee :: getSalary)));

在這里,員工指出清單。 您可以用group by或類似的替代替換summingInt,Employee是類名,getSalary是需要排序的屬性。

為了進一步參考,您可以瀏覽

http://download.java.net/lambda/b88/docs/api/java/util/stream/Collectors.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM