【问题标题】:Creating a list of pairs in java在java中创建一个对列表
【发布时间】:2011-01-24 00:45:55
【问题描述】:

哪个类最适合非有序对列表?我将使用一堆 (float,short) 对,并且需要能够执行简单的数学运算(例如将它们相乘以返回单个浮点数等)。 List 只接受一个参数,而 HashMap 不允许重复(据我所知)。有什么想法吗?

【问题讨论】:

    标签: java list


    【解决方案1】:

    您可以使用HashMap 使用的Entry<U,V> 类,但您会被getKeygetValue 的语义卡住:

    List<Entry<Float,Short>> pairList = //...
    

    我的偏好是创建自己的简单Pair 类:

    public class Pair<L,R> {
        private L l;
        private R r;
        public Pair(L l, R r){
            this.l = l;
            this.r = r;
        }
        public L getL(){ return l; }
        public R getR(){ return r; }
        public void setL(L l){ this.l = l; }
        public void setR(R r){ this.r = r; }
    }
    

    然后当然使用这个新类创建一个List,例如:

    List<Pair<Float,Short>> pairList = new ArrayList<Pair<Float,Short>>();
    

    您也可以始终将Lists 设为Lists,但很难强制调整大小(您只有对),并且与数组一样,您需要具有一致的输入。

    【讨论】:

    • 但我肯定会创建占位符类,然后将它的实例添加到列表中——直言不讳...
    • 假设我打算在没有新课程的情况下执行此操作。我正在考虑只运行两个适当类型的列表。为什么我这样做时会抱怨: private List floatList = new List();但当我离开赋值运算符而只有私有 List floatList; ?它仍然需要实例化不是吗?
    • @V1rtua1An0ma1y: 因为List 是一个接口,所以你需要一个实现,比如ArrayListLinkedList
    • 你的代码中有一个小错字,在getL()和getR()中,应该是"return l;"和“返回 r;”而不是“返回 L;”和“返回 R;”。
    • 您可能还想让Pair 不可变。
    【解决方案2】:

    类似于 Mark E 提出的建议,但如果您不介意依赖 3rd 方库,则无需重新创建轮子。

    Apache Commons 已经定义了元组:

    org.apache.commons.lang3.tuple.Pair<L,R>
    

    Apache Commons 是如此普遍,无论如何,我通常已经在我的项目中拥有它。 https://mvnrepository.com/artifact/org.apache.commons/commons-lang3

    【讨论】:

    • 这在 9 年前行不通,但现在行得通。
    【解决方案3】:

    使用自定义类实例列表。自定义类是某种 Pair 或 Coordinate 或其他。那么就

    List<Coordinate> = new YourFavoriteListImplHere<Coordinate>()
    

    这种方法的优点是它可以满足“执行简单的数学运算(例如将这对相乘以返回单个浮点数等)”这一要求干净,因为您的自定义类可以包含您需要执行的任何数学运算的方法。 ..

    【讨论】:

      【解决方案4】:

      只是修复了 Mark Elliot 代码中的一些小错误:

      public class Pair<L,R> {
          private L l;
          private R r;
          public Pair(L l, R r){
              this.l = l;
              this.r = r;
          }
          public L getL(){ return l; }
          public R getR(){ return r; }
          public void setL(L l){ this.l = l; }
          public void setR(R r){ this.r = r; }
      }
      

      【讨论】:

        【解决方案5】:

        听起来您需要创建自己的配对类(请参阅discussion here)。然后列出您创建的该对类的列表

        【讨论】:

          【解决方案6】:

          与 Mark E 的建议类似,您必须提出自己的建议。只是为了对您有所帮助,有一篇简洁的文章 http://gleichmann.wordpress.com/2008/01/15/building-your-own-literals-in-java-tuples-and-maps/ 为您提供了一种非常简洁的方法来创建您可能需要考虑的元组和映射。

          【讨论】:

            【解决方案7】:

            如果你想要多重性,你可以把它放在映射对到数量的映射中。 这样只会有一对给定的值,但它可以表示多次出现。

            那么如果你有很多repeatet值并且想要对所有值执行一些操作,你可以节省很多计算。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2022-01-22
              • 2010-10-25
              • 2023-02-10
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多