【问题标题】:Dynamic List of lists in Java [closed]Java中列表的动态列表[关闭]
【发布时间】:2016-12-13 05:22:31
【问题描述】:

我想读取一个包含以下信息的文件:

4 //no. of machines 
1,3,6,1 //timings for machine 1
1,3,6,1 //timings for machine 2
1,3,6,1 //timings for machine 3
1,3,6,1 //timings for machine 4
2,4,8,10 //cost for machine 1
2,4,8,10 //cost for machine 2
2,4,8,10 //cost for machine 3
2,4,8,10 //cost for machine 4

没有。时序阵列和成本阵列的数量取决于编号。的机器。时序数组的索引“i”中的元素与成本数组中的相同索引相关联。例如,机器 1 的时间 1 产生的成本为 2,而时间 3 的成本为 4。谁能建议哪种数据结构最适合这种情况以及我应该如何处理它?

提前致谢。

【问题讨论】:

  • int data[N][2][4] for N 机器 data[n][0] 是 n 的时间,data[n][1] 是成本。

标签: java arrays list arraylist


【解决方案1】:

您可以使用映射来定义timingcost 之间的关系。或者,您可以为时间成本关系设置一个 TimeCost 类。

public class TimeCost{
     private Integer time;
     private Integer cost;
}

public class Machine{
     // private Map<Integer,Integer> timeCost; //possible alternative
     private List<TimeCost> timeCost;
}

【讨论】:

  • Map 是个坏主意,因为您将丢失排序,并且您将无法在同一时间存储多个记录。您的替代方案要好得多。
  • 要完成你的答案,如果你阅读了整个文件,你需要一个机器列表。
  • 时间不是唯一的,所以你不能按它们索引!
【解决方案2】:

首先,您可能应该使用Pair 来保存时间和成本之间的关系:

class Pair {
    int timing;
    int cost;
}

然后,我假设您没有收到有关您获得多少时间/成本的信息,因此您必须使用 ArrayList 来表示机器的信息:

class Machine {
    ArrayList<Pair> timingAndCost;
}

那么,既然为你指定了机器的数量,就使用一个固定大小的数组来存储机器:

Machine[] machines = new Machine[numberOfMachines];

如果您正在考虑将ArrayLists 存储在一个数组中,如下所示:

ArrayList<Pair>[] machines = new ArrayList<Pair>[numberOfMachines];

它不起作用,因为 Java 不允许您声明泛型数组。但如果你真的不喜欢 Machine 类,那么你可以使用 ArrayList 来存储 ArrayList&lt;Pair&gt;

ArrayList<ArrayList<Pair>> machines = new ArrayList<>(numberOfMachines);

【讨论】:

    【解决方案3】:
    import java.util.ArrayList;
    
    
    
    class DaMachine {
        private final int   mMachineIndex;
        private final int[] mTimings;
        private final int[] mCosts;
    
        public DaMachine(final int pMachineIndex, final int[] pTimings, final int[] pCosts) {
            mMachineIndex = pMachineIndex;
            mTimings = pTimings;
            mCosts = pCosts;
        }
    
        @Override public String toString() {
            final StringBuilder sb = new StringBuilder();
            for (int i = 0; i < mTimings.length; i++) {
                sb.append(mTimings[i] + ":" + mCosts[i] + " ");
            }
            return "Machine [#" + mMachineIndex + ": " + sb + "]";
        }
    }
    
    
    
    class CrazyFile {
        static public String CRAZY = "4 //no. of machines \r\n" + //
                "1,3,6,1 //timings for machine 1\r\n" + //
                "1,3,6,1 //timings for machine 2\r\n" + //
                "1,3,6,1 //timings for machine 3\r\n" + //
                "1,3,6,11 //timings for machine 4\r\n" + //
                "2,4,8,10 //cost for machine 1\r\n" + //
                "2,4,8,10 //cost for machine 2\r\n" + //
                "2,4,8,10 //cost for machine 3\r\n" + //
                "2,4,8,111 //cost for machine 4";
    }
    
    
    
    public class ReadCrazyFile {
        public static void main(final String[] args) {
            final String[] lines = CrazyFile.CRAZY.replace("\r\n", "\n").replace("\r", "\n").split("\n");
    
            final int numberOfMachines = Integer.parseInt(cleanString(lines[0]));
            final ArrayList<String> timingStrings = new ArrayList<>(numberOfMachines);
            final ArrayList<String> costStrings = new ArrayList<>(numberOfMachines);
            int offset = 1;
    
            // add timings
            for (int relIndex = 0; relIndex < numberOfMachines; relIndex++) {
                timingStrings.add(cleanString(lines[offset + relIndex]));
            }
            offset += numberOfMachines;
    
            // add costs
            for (int relIndex = 0; relIndex < numberOfMachines; relIndex++) {
                costStrings.add(cleanString(lines[offset + relIndex]));
            }
            offset += numberOfMachines; // not necessary unless used later
    
            // convert into objects
            final ArrayList<DaMachine> machines = new ArrayList<>(numberOfMachines);
            for (int machineIndex = 0; machineIndex < timingStrings.size(); machineIndex++) {
                final String timingString = timingStrings.get(machineIndex);
                final String costsString = costStrings.get(machineIndex);
                final int[] timings = convertToIntArr(timingString);
                final int[] costs = convertToIntArr(costsString);
                final DaMachine terminator = new DaMachine(machineIndex, timings, costs);
                machines.add(terminator);
            }
    
            for (final DaMachine m : machines) {
                System.out.println("" + m);
            }
        }
    
        static private String cleanString(final String pString) {
            return pString.split("//")[0].trim();
        }
    
        static private int[] convertToIntArr(final String pTimingString) {
            final String[] words = pTimingString.split(",");
            final int[] ret = new int[words.length];
            for (int i = 0; i < words.length; i++) {
                ret[i] = Integer.parseInt(words[i].trim());
            }
            return ret;
        }
    }
    

    【讨论】:

      【解决方案4】:

      这是解决问题所需的结构。

      ArrayList<ArrayList<Integer>> listOLists = new ArrayList<ArrayList<Integer>>();
      ArrayList<Integer> list1= new ArrayList<Integer>();
      
      list1.add(4);
      listOLists.add(list1)
      
      ArrayList<Integer> list2= new ArrayList<Integer>();
      list2.add(1);
      list2.add(3);
      list2.add(6);
      list2.add(1);
      listOLists.add(list2);
      
      ArrayList<Integer> list3= new ArrayList<Integer>();
      list3.add(1);
      list3.add(3);
      list3.add(6);
      list3.add(1);
      listOLists.add(list3);
      

      这样明智地你可以继续。这只是一个粗略的想法,请根据您的需要优化此代码。

      【讨论】:

      • 有意义的名字在编程中非常重要,list1,list2 - 它没有说明里面有什么......我明白这是为了说明一般概念
      猜你喜欢
      • 2012-06-07
      • 1970-01-01
      • 2020-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多