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