2

我一直在做一个练习题。这个想法是我应该采用一个链表,然后将一个一元转换器应用于列表,并返回修改后的列表。我没有应用特定的更改,只是处理并返回一个链接列表。这是细分以及说明提供的 UnaryTransformer 方法:

“如果 L 是 Q 类型的对象链表的头部,而 R 是 UnaryTransformer,则 transformAll(L,R) 是通过将 R 按顺序应用于 L 中的每个对象而获得的对象链表。”

{@code UnaryTransformer} objects are used to represent functions with the signature:

在此处输入图像描述

public interface UnaryTransformer<Q> {
      /**
       * Returns the result of applying a function modeled by
       * {@code UnaryTransformer} to the given object
       *
       * @param object the object to transform
       * @return the result of applying a function
       */
    Q apply(Q object);
}

到目前为止,我有这段代码,但它没有编译。

public static transformAll(Node L, R) {
    if (L != null) {
    LinkedList<Q> sequence = new LinkedList<Q>();

    for (int i = 0; i < size(); i++) {
        if (p.apply(get(i))){
            sequence.add(get(i));
            }
        }
return sequence;
    }
} 
4

1 回答 1

0

你很亲近!假设您的get方法返回LinkedListat index的元素,则i调用它两次将返回相同的元素,无论它是否被映射。您应该将结果R.apply直接传递给 newLinkedList以确保它映射:

public LinkedList<Q> transformAll(Node L, UnaryTransformer<Q> R) {
    if (L == null) {
        return null;
    }

    LinkedList<Q> sequence = new LinkedList<>();

    for (int i = 0; i < size(); i++) {
        sequence.add(R.apply(get(i)));
    }

    return sequence;
}

记住getforLinkedList是一个O(n)操作,所以这个方法是O(n^2). 它可以通过简单地直接迭代来缓解LinkedList

注意:这假定此方法位于您的LinkedList类中并且Q是列表的通用类型。

于 2018-02-18T18:27:02.833 回答