首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java中的叉积计算器

Java中的叉积计算器
EN

Stack Overflow用户
提问于 2011-08-04 17:37:51
回答 2查看 1.6K关注 0票数 2

我正在用我的方式学习Norvig's book on AIP。其中有一个关于编写交叉乘积函数的练习-

代码语言:javascript
复制
(defun cross-product (fn list-1 list-2)
  (mappend #'(lambda (y)
               (mapcar #'(lambda (x)
                           (funcall fn y x))
                       list-2))
           list-1))

(defun mappend (fn the-list)
  (if (null the-list)
      nil
      (append (funcall fn (first the-list))
              (mappend fn (rest the-list)))))

我正在尝试用Java写一个实现--

代码语言:javascript
复制
interface Function<T1, T2, T3> {
    public T3 function(T1 t1, T2 t2);
}

public class CrossProduct<T1, T2> {
    private List<T1> list1;
    private List<T2> list2;

    public CrossProduct(List<T1> t1, List<T2> t2) {
         this.list1 = t1;
         this.list2 = t2;
    }

    public <T3> List<T3> calculate(Function<T1, T2, T3> fn) {
    List product = new ArrayList();
    for (int i = 0; i < list1.size(); i++)
        for (int j = 0; j < list2.size(); j++)
            product.add(fn.function(list1.get(i), list2.get(j)));
    return product;
}

}

用法-

代码语言:javascript
复制
@Test
public void testWithStrings() {
    List<String> list1 = new ArrayList<String>();
    list1.add("6");
    list1.add("8");

    List<String> list2 = new ArrayList<String>();
    list2.add("2");
    list2.add("3");

    List<String> product = new CrossProduct<String, String>(list1, list2)
            .<String> calculate(new Function<String, String, String>() {
                public String function(String x, String y) {
                    return (String) x + (String) y;
                }

            });

    Assert.assertEquals("62", product.get(0));
    Assert.assertEquals("63", product.get(1));
    Assert.assertEquals("82", product.get(2));
    Assert.assertEquals("83", product.get(3));
}

有没有更好的方法来做这件事?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-08-04 22:45:58

这样定义您的CrossProduct类似乎有点武断:为什么列表参数是成员变量,而fn是方法参数?事实上,为什么CrossProduct是一个类呢?交叉产品is a列表,但它不是list的子类型,因为给定的列表可以同时

  1. 可以用许多不同的方式表示为叉积,并且
  2. 不是使用crossproduct函数构造的。

把“叉积”看作是一种类型是不自然的,国际海事组织。

我可能会做这样的事情

代码语言:javascript
复制
public class ListFunctions {
    public static <T1, T2, T3> List<T3> crossProduct(List<T1> list1, List<T2> list2, Function<T1, T2, T3> fn) {
        List<T3> product = new ArrayList<T3>();
        for (int i = 0; i < list1.size(); i++)
          for (int j = 0; j < list2.size(); j++)
            product.add(fn.function(list1.get(i), list2.get(j)));
        return product;
    }
}

如果你确实出于某种原因想要定义一个类CrossProduct (例如像salman建议的那样实现惰性计算),我会说将所有三个参数都作为成员变量并让类实现List更面向对象。

代码语言:javascript
复制
public class CrossProduct<T1, T2, T3> implements List<T3> {
    public CrossProduct(T1 list1, T2 list2, Function<T1, T2, T3> fn) {
        // remember args...
    }
    // etc...
}
票数 1
EN

Stack Overflow用户

发布于 2011-08-04 19:25:45

我并不确切地知道您想要改进哪些参数。然而,我想说我不喜欢N*M列表大小,因为它可能太大了。如果我知道结果列表可以是不可变的,那么我会实现我自己的列表,它只在调用result.get(i*M+j-1)时计算product(l1(i), l2(j))。所以我没有保留一个很长的列表(如果需要,可能只有一个很小的缓存)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6939145

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档