繁体   English   中英

对元素仍处于第一个位置的列表进行排序

[英]Sort a list with element still in first position

我有一个字符串列表:

List<String> listString  = new ArrayList<String>();
listString.add("faq");
listString.add("general");
listString.add("contact");

我对列表做了一些处理,我想对这个列表进行排序,但我希望“一般”总是排在第一位。 谢谢 ;)

我喜欢@Petar 的方法,但另一种方法是使用自定义比较器对其进行排序,该比较器总是说“一般”在被比较之前。

Collections.sort(list, new Comparator<String>()
  {
     int compare(String o1, String o2)
     {
         if (o1.equals(o2)) // update to make it stable
           return 0;
         if (o1.equals("general"))
           return -1;
         if (o2.equals("general"))
           return 1;
         return o1.compareTo(o2);
     }
});

改为在其subList上执行Collections.sort

    List<String> list = new ArrayList<String>(
        Arrays.asList("Zzz...", "Two", "One", "Three")
    );
    Collections.sort(list.subList(1, list.size()));
    System.out.println(list);
    // "[Zzz..., One, Three, Two]"

接口链接

  • subList(int fromIndex, int toIndex)
    • 返回此列表中指定的fromIndextoIndex之间的部分的视图。 返回列表受此列表支持,因此返回列表中的非结构性更改会反映在此列表中,反之亦然。 返回的列表支持此列表支持的所有可选列表操作。

如果特殊元素不在索引 0 处,则只需将其放在那里,然后按如下方式对其进行排序:

    List<String> list = new ArrayList<String>(
        Arrays.asList("Four", "Five", "Zzz...", "Two", "One", "Three")
    );
    Collections.swap(list, list.indexOf("Zzz..."), 0);
    Collections.sort(list.subList(1, list.size()));
    System.out.println(list);
    // "[Zzz..., Five, Four, One, Three, Two]"

接口链接

对列表进行排序而不在其中包含“常规”,然后将其添加到开头。

您可以使用以下代码片段,但对于非常大的列表,它可能存在性能/内存问题。

public static List<String> sortSpecial(List<String> list, final String alwaysOnTopItem) {
    list.remove(alwaysOnTopItem);
    Collections.sort(list);

    List<String> result = new ArrayList<String>(list.size() + 1);
    result.add(alwaysOnTopItem);
    result.addAll(list);

    return result;
}

public static void main(String[] args) {
    List<String> listString = new ArrayList<String>();
    listString.add("faq");
    listString.add("general");
    listString.add("contact");
    String alwaysOnTopItem = "general";
    List<String> sortedList = sortSpecial(listString, alwaysOnTopItem);
    System.out.println(sortedList);
}

好的! 题。 如果我们想固定第一个和最后一个元素的位置,那么我们可以增强@Paul Tomblin's方法,如下所示。 请复制代码并尝试。

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class CustomComparatorToFixedPosition {

  public static void main(String[] args) {
    List<Emp> empNames = new ArrayList<>();
    empNames.add(new Emp("name1"));
    empNames.add(new Emp("LastName"));
    empNames.add(new Emp("name2"));
    empNames.add(new Emp("FirstName"));
    empNames.add(new Emp("name3"));
    getSortedName(empNames).stream().forEach(emp -> System.out.println(emp.getName()));
  }

  public static List<Emp> getSortedName(List<Emp> empNames) {
    String first = "FirstName";
    String last = "LastName";
    Collections.sort(empNames, new Comparator<Emp>() {
      public int compare(Emp o1, Emp o2) {
        if (o1.getName().equalsIgnoreCase(first) || o2.getName().equalsIgnoreCase(last))
          return -1;
        if (o2.getName().equalsIgnoreCase(first) || o1.getName().equalsIgnoreCase(last))
          return 1;
        return o1.getName().compareTo(o2.getName());
      }
    });
    return empNames;
  }
}

class Emp {

  private String name;

  Emp(String name) {
    this.name = name;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM