java - 通过扫描文件中的数据和特定日期的输出数据来合并不同日期的结果

标签 java algorithm hashmap filereader

我最近接受了主要跨国公司的面试并遇到了一个编码问题。这是一个基于 list 的问题。得到一个输入为的文件:

Date, name of fruit, no of fruits sold, total fruits.

**2018-06-01,apple,15,25 ;
2018-06-02,apple,13,25 ;
2018-06-03,apple,20,25 ; 
2018-06-01,mango,12,25 ;
2018-06-02,mango,19,25 ;
2018-06-03,mango,20,25 ;
2018-06-01,orange,15,25 ;
2018-06-02,mango,16,25 ;
2018-06-02,orange,14,25 ;
2018-06-03,orange,24,25 ;
2018-06-02,apple,18,25** 

我必须迭代文件,最后打印出 2018-06-02 卖出了多少水果的结果。下面是我写的代码

enter code here
public class Inventory {
            public static void main(String[] args) throws IOException {
                FileInputStream geek = new FileInputStream("/Users/preet/Desktop/test2.txt");
                InputStreamReader reader = new InputStreamReader(geek, StandardCharsets.UTF_8);
                BufferedReader in = new BufferedReader(reader);
                List<String> lines = new ArrayList<String>();

                Map<String, Map<String, List<Integer>>> map = new HashMap<String, Map<String, List<Integer>>>();

                Map<String, List<Integer>> map2 = new HashMap<String, List<Integer>>();
                List<Integer> apple = new ArrayList<Integer>();
                List<Integer> mango = new ArrayList<Integer>();
                List<Integer> orange = new ArrayList<Integer>();
                String result = "";
                String line = null;
                String[] input = new String[10];
                int i = 0;
                while ((line = in.readLine()) != null) {
                    input[i] = line;
                    System.out.println("value at " + i + ":" + input[i]);
                    i++;
                }

                for (String a : input) {
                    String b[] = a.split(",");
                    if (b[1].equalsIgnoreCase("apple")) {
                        apple.add(Integer.parseInt(b[2]));
                        map2.put(b[1], apple);
                        map.put(b[0], map2);
                    } else if (b[1].equalsIgnoreCase("orange")) {
                        orange.add(Integer.parseInt(b[2]));
                        map2.put(b[1], orange);
                        map.put(b[0], map2);
                    } else if (b[1].equalsIgnoreCase("mango")) {
                        mango.add(Integer.parseInt(b[2]));
                        map2.put(b[1], mango);
                        map.put(b[0], map2);
                    }
                    if (map.containsKey(b[0])) {
                        Object value1 = map.get(b[0]);
                        map.put(b[0], map2);
                        } else
                        map.put(b[0], map2);
                }
                System.out.println("Fetching Keys and corresponding [Multiple] Values n");
                List<String> results = new ArrayList<String>();
                for (Map.Entry<String, Map<String, List<Integer>>> entry : map.entrySet()) {
                    String orange1 = null;
                    String apple1 = null;
                    String mango1 = null;
                    int a1 = 0;
                    int a2 = 0;
                    int a3 = 0;
                    Map<String, List<Integer>> values = entry.getValue();
                    for (Map.Entry<String, List<Integer>> entry1 : map2.entrySet()) {
                        String key = entry1.getKey();
                        if (key.equalsIgnoreCase("apple")) {
                            List l1 = entry1.getValue();
                            for (int j = 0; j < l1.size(); j++) {
                                a1 = (int) l1.get(j);
                            }
                            apple1 = entry.getKey() + " " + a1 + " apples";
                            results.add(apple1);
                        } else if (key.equalsIgnoreCase("mango")) {
                            List l1 = entry1.getValue();
                            for (int j = 0; j < l1.size(); j++) {
                                a2 = (int) l1.get(j);
                            }
                            mango1 = entry.getKey() + " " + a2 + " mangoes";
                            results.add(mango1);
                        } else if (key.equalsIgnoreCase("orange")) {
                            List l1 = entry1.getValue();
                            for (int j = 0; j < l1.size(); j++) {
                                a3 = (int) l1.get(j);
                            }
                            orange1 = entry.getKey() + " " + a3 + " oranges";
                            results.add(orange1);
                        }
                    }
                     System.out.println("Values = " + (values));
                }
                System.out.println("****" + results);
                  }
        }

最佳答案

对于面试,我建议将以下内容作为第一步:遍历文件。使用 String.split() 以逗号分隔每一行。如果结果数组的元素 0 与 2018-06-02 相同,则使用 Integer.parseInt() 解析元素 2 中的整数(售出的水果数量)和添加到总数中。

这样的第一枪显然缺少输入验证。可能首先检查文件中至少有一行。检查每行是否以分号结尾。在拆分之前删除它和它之前的任何空间。检查数组的长度是否为 4。使用单参数 LocalDate.parse() 解析每一行的日期,并使用 Integer.parseInt() 解析两者售出数量和总数量。验证售出数量是否小于或等于总数。还可以检查该名称是否是已知水果的名称。

另一件事是数据建模。例如,设计一个带有名称字段的水果类和一个带有日期、总数和销售数量的水果销售类。

关于java - 通过扫描文件中的数据和特定日期的输出数据来合并不同日期的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50682592/

相关文章:

java - 修改 HashMap 的输出并解析为 Integer

java - 如何反转 HashMap 的键和值?

java - 为有效 xml 创建 Diff 对象时,XMLUnit 抛出 NullPointerException

java - 如何在oracle和java中的时间戳值中保留24小时00分钟

算法 - 搜索函数返回特定值的输入

c - 在c中标记字符串的快速方法

algorithm - 网络建模图上的 Dijkstra 算法

java - 组合包含 HashMap 的数组列表

java - 将 Spring Boot 与 EBean 和 HikariCP 连接池集成

java - 为什么我的 Wicket 面板在更改默认模型后不重新渲染?