如何将项目放在java中的ArrayList顶部

时间:2010-07-16 04:34:26

标签: java collections

我有一个ArrayList我需要排序,而且我需要一个特定的默认项目在列表的顶部。我可以通过检查数组列表,删除默认项目并将其插入列表顶部来自行完成。

基本上,列表应该在顶部具有默认值,而剩余值在排序顺序中。是否有任何现有的API方法可以做到这一点?

3 个答案:

答案 0 :(得分:7)

我只是写了一个方法来做你所描述的......就像:

public static <T> void sortWithDefault(final List<T> list)
{
    Collections.sort(list);
    // remove the default item
    // insert the default item at the start of the list
}

您也可以使用比较器(虽然不太明显),它总是将默认项目作为任何比较中的最低项目与其余项目的自然比较进行比较。为此你可以调用Collections.sort(List,Comparator);

以下是此类比较器的一些代码......再次。我不是很喜欢它,因为它并不明显......但我认为这是一个合理的解决方案:

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

public class Main
{
    public static void main(final String[] argv)
    {
        final List<Integer> list;

        list = new ArrayList<Integer>();

        for(int i = 10; i > 0; i--)
        {
            list.add(i);
        }

        Collections.sort(list, new DefaultAtStartComparator<Integer>(5));

        System.out.println(list);
    }
}

class DefaultAtStartComparator<T extends Comparable>
    implements Comparator<T>
{
    private final T defaultValue;

    public DefaultAtStartComparator(final T value)
    {
        defaultValue = value;
    }

    public int compare(final T a,
                       final T b)
    {
        if(a.equals(defaultValue))
        {
            return (-1);
        }

        if(b.equals(defaultValue))
        {
            return (1);
        }

        return (a.compareTo(b));
    }
}

答案 1 :(得分:5)

ArrayList.add(int index,E element)

在此列表中的指定位置(E)插入指定的元素(index)。将当前位置的元素(如果有)和任何后续元素向右移动(将其添加到其索引中)。

如果您需要将元素放在列表顶部,可以将

index设置为0.

答案 2 :(得分:4)

不是我知道的。 你可能只需像你说的那样手动做某事......例如

List<T>  list = new ArrayList<T>();
//  Insert items into list
...

Collections.sort(list);

T defaultValue = null;
for (int i = 0; i < list.size(); i++) {
    T value = list.get(i);
    if (isDefaultValue(defaultValue)) {           
        defaultValue = list.remove(i);
    }        
}

if (defaultValue != null) {
    list.add(0, defaultValue);
}