Java集合+IO相关习题

1、提供一个文件操作的方法,其需要实现功能:对一个文件的任意位置可以插入任何内容

public class TestDemo8 {

    /**
     * 提供一个文件操作的方法,其需要实现功能:对一个文件的任意位置可以插入任何内容
     * @param filePath 文件路径
     * @param postion  追加内容添加位置
     * @param contens  追加内容
     */
    private static void addContentsToFile(String filePath, int postion, String contens) {
        try {
            //参数校验
            File file = new File(filePath);
            if (!(file.exists() && file.isFile())) {
                System.err.println("文件不存在");
                return;
            }
            if (postion < 0 || postion > file.length()) {
                System.err.println("postion参数不合法");
                return;
            }

            //创建零时文件File
            File tempFile = File.createTempFile("", ".tmp", new File("."));
            FileOutputStream outputStream = new FileOutputStream(tempFile);
            FileInputStream inputStream = new FileInputStream(tempFile);
            //在JVM退出时自动删除
            tempFile.deleteOnExit();

            RandomAccessFile rw = new RandomAccessFile(file, "rw");

            //文件指针定位到postion
            rw.seek(postion);
            int tmp ;
            //将postion位置之后内容写入临时文件
            while ((tmp = rw.read()) != -1) {
                outputStream.write(tmp);
            }

            //将追加内容contents写入到postion位置
            rw.seek(postion);
            rw.write(contens.getBytes());

            //将临时文件写回文件
            while ((tmp = inputStream.read()) != -1) {
                rw.write(tmp);
            }

            rw.close();
            inputStream.close();
            outputStream.close();
        } catch (Exception e) {
            System.out.println("写入失败!");
            e.printStackTrace();
        }
    }




    public static void main(String[] args) {
        String filePath = "D:\\lzq/int.txt";
        int postion = 9;
        String contens = "潦水尽而寒潭清,烟光凝而暮山紫。";
        addContentsToFile(filePath,postion,contens);
    }

}

2、有两个有序的集合,集合的每个元素都是一段范围,求其交集,例如交集{[4,8],[9,13]}和{[6,12]}的交集是{[6,8],[9,12]}

package com.tulun.liu;

    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.List;

    public class TestDemo10 {
         public static void main(String[] args) {
            /**
             * 例如交集{[4,8],[9,13]}和{[6,12]}的交集是{[6,8],[9,12]}
             */
            List <List <Integer>> collection1 = new ArrayList <List <Integer>>();
            ArrayList <Integer> list11 = new ArrayList <>();
            list11.add(4);
            list11.add(8);
            collection1.add(list11);

            ArrayList <Integer> list12 = new ArrayList <>();
            list12.add(9);
            list12.add(13);
            collection1.add(list12);

            ArrayList <List <Integer>> collection2 = new ArrayList <>();
            ArrayList <Integer> list21 = new ArrayList <>();
            list21.add(6);
            list21.add(12);
            collection2.add(list21);
            intersectionWithColletion(collection1, collection2);
        }


        /**
         * 两个有序的集合,集合的每个元素都是一段范围,求其交集
         * 所求交集结果直接打印到输出终端
         * @param collects1:集合1
         * @param collects2:集合2
         */
        public static void intersectionWithColletion(List<List<Integer>> collects1, List<List<Integer>> collects2) {
            //参数校验
            if (!(isVaild(collects1) && isVaild(collects2))) {
                return;
            }

            Iterator <List <Integer>> iterator1 = collects1.iterator();
            while (iterator1.hasNext()) {
                List <Integer> list1 = iterator1.next();
                Iterator <List <Integer>> iterator2 = collects2.iterator();
                while (iterator2.hasNext()) {
                    List <Integer> list2 = iterator2.next();
                    intersection(list1, list2);
                }
            }


        }

        /**
         * 求区间交集
         * @param list1
         * @param list2
         */
        private static void intersection(List<Integer> list1, List<Integer> list2) {
            Integer a1 = list1.get(0);
            Integer a2 = list1.get(1);
            Integer b1 = list2.get(0);
            Integer b2 = list2.get(1);

            if (a1 > b2 || b1 > a2) {
                return;
            }
            if (a1 == b2) {
                System.out.println("["+a1+"]");
            }
            if (a2 == b1) {
                System.out.println("["+a2+"]");
            }
            if (a1 > b1) {
                System.out.print("[" + a1 + ",");
                if (b2 < a2) {
                    System.out.println(b2 + "]");
                } else {
                    System.out.println(a2 + "]");
                }
            }
            if (b1 >=  a1) {
                System.out.print("["+b1+",");
                if (b2 < a2) {
                    System.out.println(b2 + "]");
                } else {
                    System.out.println(a2 + "]");
                }
            }
        }

        /**
         * 参数校验
         * @param collects
         * @return
         */
        private static boolean isVaild(List<List<Integer>> collects) {
            if (collects.size() < 1) {
                System.err.println("两集合无交集");
                return false;
            }
            Iterator <List <Integer>> iterator = collects.iterator();
            while (iterator.hasNext()) {
                List <Integer> list = iterator.next();
                if (list.size() != 2) {
                    System.err.println("集合区间不合法");
                    return false;
                }
                if (list.get(0) > list.get(1)) {
                    System.err.println("集合区间非有序");
                    return false;
                }
            }
                return true;
        }

    }

运行结果:

[6,8]
[9,12]

3、一个文本文件记录了1000条数据[数据内容需自己初始化产生]。数据内容为部分用户的银行卡消费记录,消费记录信息包含([姓名] [消费金额]),找出消费次数最多的用户,并且该用户单笔消费最高的金额是多少?
例:文件内容格式
张三,666
李四,7893
张三,9999
获取结果则为:张三消费次数最多,最高消费金额为:9999

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Random;


/**
 * 
 * @author lzq
 *
 */
public class TestDemo9 {
    /**
     * 初始化文件内容:数据内容为用户的银行卡消费记录,消费记录信息包含([姓名] [消费金额])
     * 要求:用户列表中的用户出现次数随机,消费金额信息随机,总数据条数1000条
     * @param filePath  文件名路径
     * @param userLists  用户列表
     */
    public static void initFile(String filePath,List<String> userLists) {
        //参数校验
        File file = new File(filePath);
        if (userLists.size() < 1) {
            System.err.println("用户列表不能为空");
            return;
        }

        try {
            FileWriter writer = new FileWriter(file);
            int size = userLists.size();

            Random random = new Random();
            for (int i = 0; i < 1000; i++) {
                StringBuffer buffer = new StringBuffer();
                buffer.append(userLists.get(random.nextInt(size)));
                buffer.append(",");
                buffer.append(random.nextInt(1000));
                buffer.append("\r\n");
                writer.write(buffer.toString());
            }
            writer.write("null");
            writer.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 在文本中寻找符合条件用户:找出消费次数最多的用户,并且该用户单笔消费最高的金额是多少?
     * 符合条件用户直接打印到输出在终端
     * @param filePath:文件名路径
     */
    public static void searchUser(String filePath) {
        try {
            FileReader reader = new FileReader(filePath);
            BufferedReader br = new BufferedReader(reader);
            String maxName = "";
            String str = null;
          //list.size该用户出现的次数  key是名字 list里面放该用户每次消费的金额
            HashMap<String, List<Integer>> map = new HashMap<>();
            Integer maxMoney = 0;
            while(!(str = br.readLine()).equals("null")) {
                String[] split = str.split(","); //split()按照指定的字符拆分字符串,拆分后放到String数组里面
                String name = split[0];
                 Integer money = Integer.valueOf(split[1]);
                if(map.containsKey(name)) {
                    List<Integer> list = map.get(name);
                    list.add(money);
                    map.put(name, list);
                }else{
                    ArrayList <Integer> integers = new ArrayList <Integer>();
                    integers.add(money);
                    map.put(name,integers );
                }
            }

                Integer num = 0;
                Iterator<Map.Entry<String,List<Integer>>> iterator = map.entrySet().iterator();
                while(iterator.hasNext()) {
                    Map.Entry<String,List<Integer>> next = iterator.next();
                    String name1 = next.getKey();
                    List<Integer> moneyNum = next.getValue();
                    if(moneyNum.size()>num) {
                        num = moneyNum.size();
                        maxName = name1;
                    }
                }
                System.out.print("消费次数最多的用户:"+maxName);

                List<Integer> list2 = map.get(maxName);
                Iterator<Integer> iterator1 = list2.iterator();

                while(iterator1.hasNext()) {
                    Integer next = iterator1.next();
                    if(next  > maxMoney  ) {
                        maxMoney = next;
                    }
                }
                System.out.println(",消费金额最多是:"+maxMoney);
           br.close();   
        } catch (Exception e) {
            e.printStackTrace();
        }
    }



    public static void main(String[] args) {
            String fileName = "D:\\lzq/money.txt";
            ArrayList <String> userlist = new ArrayList <>();
            userlist.add("张三");
            userlist.add("李四");
            userlist.add("王五");
            initFile(fileName, userlist);
            searchUser(fileName);
      }
}

运行结果:
这里写图片描述

消费次数最多的用户:李四,消费金额最多是:996

猜你喜欢

转载自blog.csdn.net/QQ2899349953/article/details/81409685