【问题标题】:HashMap of a and ArrayList of a Class一个类的HashMap和一个类的ArrayList
【发布时间】:2018-08-13 21:07:59
【问题描述】:

我是 Java 新手,我正在尝试构建一组像这样的元组:

Slegs = {<1,2,500> , <2,5,400>, <5,7,850>, <2,3,450>}

然后,定义其他数组,如:

int u [Slegs][G];

例如:

u[<1,2,500>][1] = 80
u[<2,5,400>][1] = 80
u[<1,2,500>][2] = 65
u[<2,5,400>][2] = 130

等等

为此,我编码如下:

    public class Model {
    public static int Y = 7;
    public static int K = 42;
    public static int G = 3;


class Sleg {
        public int i;
        public int j;
        public double l;


        List<Sleg> Slegs = new ArrayList<Sleg>();           

        Map <Integer, Sleg> slTup = new HAshMap<Integer, Sleg>();

        int[][] u = new int [key][G]; /* I want to define and use a key here*/
    }

我的问题是我不知道如何将这些元组添加到 slTup 的 for 循环中,以及如何为它们分配一个键,以便我可以使用该键来定义 u[key][G]; 以及,如何断言/定义 ij 在 Y 中,i !=j 在每个元组 &lt;i,j,l&gt; 中;

如果您可以使用上面给定的理论数据实例化并打印出 u[key][g],我将不胜感激。

【问题讨论】:

    标签: java hashmap tuples


    【解决方案1】:

    我有一些以下代码作为要求。不确定这个应用程序的全部内容,但这是我试图回答提出的问题:

    问题:

    • 如何在 for 循环中将这些元组添加到 slTup
    • 如何为它们分配一个键,以便我可以使用该键来定义u[key][G];
    • 可以实例化并打印出u[key][g]
    • 想要一个整数映射,Slegs 像 > 和 >,其中整数是键,然后我可以将其用于:@ 987654326@
    • 如何断言/定义ij 在每个元组的Yi !=j 中。

    请注意,它不清楚“断言ijY 中”的含义。但是,i != j 可以通过抛出运行时异常来断言(参见Sleg 类代码构造函数)。

    有可能答案的程序:

    import java.util.*;
    public class SlegProgram {
    
        private static int key;
    
        public static void main(String [] args)  {
    
            // Create some Slegs
    
            List<Sleg> slegs = Arrays.asList(new Sleg(1,2,500), new Sleg(2,5,400), new Sleg(1,2,500), new Sleg(2,5,400));
    
            System.out.println(slegs);
    
            // Create a Sleg Map with keys
    
            Map <Integer, Sleg> slegMap = new HashMap<>();
    
            for (Sleg sleg : slegs) {
                slegMap.put(++key, sleg);
            }
    
            System.out.println(slegMap);
    
            // Instantiate and printout u [key][G]
    
            for (Map.Entry<Integer, Sleg> entry : slegMap.entrySet()) {
    
                int [][] u = new int [entry.getKey()][Model.G];
                System.out.println(Arrays.deepToString(u)); // prints array with initial values: 0
                assignValuesToU(u);
            }
    
            // Assert i != j in each Sleg
    
            Sleg illegal = new Sleg(1, 1, 90); // This will throw an exception as i and j are equal
        }
    
        private static void assignValuesToU(int [][] u) {
    
            for (int i = 0; i < u.length; i++) {
                for (int j = 0; j < u[i].length; j++) {
                    u [i][j] = 80; // 80 or whatever it needs to be
                }
            }
            System.out.println(Arrays.deepToString(u)); // prints array with assigned values
        }
    }
    
    class Sleg {
        private int i;
        private int j;
        private int k;
        public Sleg(int i, int j, int k) {
            if (i == j) {
                throw new IllegalArgumentException("Invalid sleg parameters: " + Integer.toString(i));
            }
            this.i = i;
            this.j = j;
            this.k = k;
        }
        public String toString() {
            return Integer.toString(i) + "-" + Integer.toString(j) + "-" + Integer.toString(k);
        }
    }
    
    class Model {
        public static final int Y = 7;
        public static final int K = 42;
        public static final int G = 3;
    }
    

    捕获异常:

    try {
        Sleg illegal = new Sleg(1, 1, 90);
    }
    catch (IllegalArgumentException e) {
        System.out.println(e.getMessage()); // This prints something like: Invalid sleg parameters: 1
    }
    

    【讨论】:

    • 谢谢。它工作正常,除了由于异常引起的错误。但是我可以在迭代时使用 if 子句来处理这个问题。 :)
    • 应该使用 try-catch 捕获异常。我已经更新了答案帖子,展示了如何 - 例如。
    • 您能否告诉我,我是否可以将所有 Slegs 从 .txt 文件中取出,而不是手动将它们全部添加。我的意思是像数组一样,我们通过使用扫描仪、bufferedReader 和 BufferedFile 从文件中读取它们,例如Sleg.txt 文件。 Scanner sc new Scanner(new BufferedReader(new FileReader("Sleg.txt"))).
    • 是的,一个文件中可以包含 Sleg 数据。应用程序可以读取文件并创建 Slegs。此外,可以创建对象(如 Slegs)作为来自 GUI 应用程序的输入数据。这也意味着可以将 slegs 保存/存储到文件或数据库中。只能想象一个应用程序!这是working with Java IO的链接。
    【解决方案2】:

    我没有完全理解你的问题,但是根据我对实现 Slegs = { , , , } 等的理解列出 Slegs = new ArrayList();创建单独的类,如下所示:

    class slegs{
        int i, j, k;
        slegs(int i, int j, int k){
            this.i = i;
            this.j = j;
            this.k = k;
        }
    }
    

    您还可以在类中添加逻辑,例如断言/定义,或者在创建实例时添加检查。 然后您可以创建这些类的实例并使用 slegs.add(s1) 将它们添加到列表(slegs)中。要将其插入地图,只需使用实例 map.put(key, s1)。

    【讨论】:

      【解决方案3】:

      首先,要将Sleg 用作HasMapHasSet 的键,您必须正确定义hashCode()equals()。例如。喜欢这个:

      class Sleg {
      
          private final UUID id;
          private final int i;
          private final int j;
          private final double l;
      
          public Sleg(int i, int j, double l) {
              id = UUID.randomUUID();
              this.i = i;
              this.j = j;
              this.l = l;
          }
      
          @Override
          public boolean equals(Object obj) {
              if (this == obj)
                  return true;
              if (!(obj instanceof Sleg))
                  return false;
              Sleg sleg = (Sleg)obj;
              return i == sleg.i && j == sleg.j && Double.compare(sleg.l, l) == 0;
          }
      
          @Override
          public int hashCode() {
              return Objects.hash(i, j, l);
          }
      } 
      

      注意:这个类Sleg准备好成为HashMap的一个键。

      其次,您想为每个 Sleg 实例分配一个唯一的整数键。我可以建议您将此 id 直接添加到 Skeg 实例中,并在每次创建新对象时递增它:

      class Sleg {
      
          private final int id;
      
          private static final AtomicInteger nextId = new AtomicInteger();
      
          public Sleg(int i, int j, double l) {
              id = nextId.incrementAndGet();
          }
      }
      

      【讨论】:

      • 嗨,奥列格,谢谢。但是,我实际上想要一个整数和 Sleg 的映射,例如 > 和 >,其中整数是键,然后我可以在以下位置使用它:u[键][G]。
      猜你喜欢
      • 2021-12-21
      • 2017-10-19
      • 2019-09-13
      • 1970-01-01
      • 2013-02-10
      • 2016-03-10
      • 1970-01-01
      • 2018-08-17
      • 1970-01-01
      相关资源
      最近更新 更多