6

我正在调用一个返回对象集合的 API。我想获取对象的子集。我正在考虑两种解决方案。哪一个会给我更好的表现?根据我的理解,toArray()调用主要会遍历集合一次。如果这是真的,那么解决方案会更好吗?

解决方案 1 -

public static List<String> get(UUID recordid, int start, int count) {
    List<String> names = new ArrayList<String>();

    ...

    Collection<String> columnnames = result.getColumnNames();
    int index = 0; 
    for (UUID columnname : columnnames) {
        if ((index >= start) && (index - start < count)) {
            names.add(columnname);
        }
        index++;
    }

    return names;
}

解决方案 2 -

public static List<String> get(UUID recordid, int start, int count) {
    List<String> names = new ArrayList<String>();

    ...

    Collection<String> columnnames = result.getColumnNames();
    String[] nameArray = columnnames.toArray(new String(columnnames.size()));

    for (int index = 0; index < nameArray.length && count > 0; index++, count--) {
        names.add(nameArray[index]);
    }

    return names;
}
4

4 回答 4

19

如果您的 Collection 是 List,则可以使用该subList(fromIndex, toIndex)方法。

例子:

List<String> x = new ArrayList<String>();
List<String> y = x.subList(5, 10);
于 2012-04-05T16:23:07.830 回答
7

当然,遍历集合比先将其转换为数组,然后遍历数组要好。

第二种方法提供了额外的时间和内存开销:

  1. 为数组分配内存
  2. 用集合的内容填充数组
于 2012-04-05T16:20:53.483 回答
2

我认为 subList 答案是要走的路。

public static List<String> get(UUID recordid, int start, int count) {
    Collection<String> columnnames = result.getColumnNames();
    List<String> names = new ArrayList<String>(columnnames);
    return names.subList(start, start+count);
}
于 2012-04-05T16:55:16.527 回答
0

如果您有一个列表,请使用 subList 方法。这是一个这样做的例子:

private static void doTestListBreak()
{
    for (int i=0; i<= 300; i++)
    {
        for (int delta=1; delta<= 30; delta++)
        {
            testListBreak(i, delta);
        }
    }
}

public static void testListBreak(int numItems, int delta)
{
    if (delta <= 0)
        return;

    log("list(" + numItems + "): ");
    List<Integer> list = new ArrayList<Integer>();
    for (int i=0; i < numItems; i++)
    {
        list.add(i);
    }

    for (int i=0; i < list.size(); i=i+delta)
    {
        int max = Math.min(list.size(), i + delta);
        List<Integer> subList = list.subList(i, max);
        log("list(" + numItems + "," + delta + "): " + subList);
    }
}

public static void log(String msg) 
{
    System.out.println(msg);
}
于 2013-11-19T17:15:00.790 回答