0

我有一个带有两个字段名称和年份的数组列表。我想用条件输入名称对这个数组进行排序(按名称输入排序)。如果名称相同,它将按年份排序。

Example
Name     Year
Ann      2000
Bech     2001
Bach     2013
Bach     2012
Chu      1999

假设我创建的函数是排序,输入是巴赫。结果将显示

Name     Year
Bach     2013
Bach     2012
Ann      2000
Bech     2001
Chu      1999

因为输入是巴赫,第一个我想用“巴赫”显示所有名称如果相同的名称,我将按年份(最大 - 最小)对其进行排序。如果不是相同的“Bach”名称,我将使用 compareTo() 按 AZ 排序这是我的代码,但我没有输入条件名称。请创建一个新函数帮助我相同的 sort_inputname(String inputname)

    //Class compare Name- Year
public class Search_Name_Year_Comparator implements Comparator<SearchListInformation>
{


            public int compare(SearchListInformation left,
                    SearchListInformation right) {
                // TODO Auto-generated method stub
                 int dateComparison;
                    int dataComparison = 0;
        if(left.getName().compareTo(right.getName())==0)
            {
             if(left.getYear().compareTo(right.getYear())>0)
             {
             return -1;
             }
             else if(left.getYear().compareTo(right.getYear())<0)
             {
                 return  1;
             }
             else 
                 return 0;


             }
        else
         return  left.getName().compareTo(right.getName());
4

1 回答 1

0

有点难以理解你的问题(我假设你不是以英语为母语的人,但你不能为此受到责备)。据我了解,您想要对具有 2 个属性的对象的 ArrayList 进行排序:名称和年份。让我们假设这些对象称为“SearchListInformation”,因此您尝试对 SearchListInformation 的 ArrayList 进行排序。

我在这里要做的是让 SearchListInformationclass 实现Comparable(不是 Comparator)接口(有关更多信息,请参见链接)。然后您可以使用 Collections.sort 对 ArrayList 进行排序,例如:

    ArrayList<SearchListInformation> list = new ArrayList<SearchListInformation>();
    list.add(new Person("Bob", 2000));
    list.add(new Person("Lucy", 2010));
    Collections.sort(list);

如果要使用 Comparator 接口,还可以使用 Collections.sort(List, Comparator)。然后你可以使用你发布的代码,但我会这样简化:

    @Override
    public int compare(SearchListInformation left, SearchListInformation right) {
        if(left.getName().compareTo(right.getName())==0)
             return -1*left.getYear().compareTo(right.getYear())
        else
            return  left.getName().compareTo(right.getName());
    }

编辑:如果您希望能够指定应始终位于列表开头的名称,则应使用第二个选项:实现 Comparator 接口,如下所示:

    public MyComparator implements Comparator<SearchListInformation> {

        protected String _priorityName;

        public MyComparator(String priorityName) {
            _priorityName = priorityName;
        }

        @Override
        public int compare(SearchListInformation left, SearchListInformation right) {
            if(left.getName().compareTo(right.getName())==0)
                 return -1*left.getYear().compareTo(right.getYear())
            else if(left.getName().equals(_priorityName)
                return -1;
            else if(right.getName().equals(_priorityName)
                return 1;
            else
                return  left.getName().compareTo(right.getName());
        }

    }

然后你可以使用:

    Collections.sort(list, new MyComparator("Bach"));
于 2012-12-29T18:49:13.667 回答