【代码实战】精品面试题14道

编程入门 行业动态 更新时间:2024-10-26 14:29:01

【代码<a href=https://www.elefans.com/category/jswz/34/1769775.html style=实战】精品面试题14道"/>

【代码实战】精品面试题14道

【代码实战】精品面试题14道

1.用Java实现一个函数把两个有序的int数组结合成新的有序数组?
2.用Java代码实现给a[n]数组进行全排序,找到一个组合的前一个组合,比如a[3]{[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],
[3,2,1]},给出[2,3,1,],找到他的前序是[2,1,3]?

3.Java实现给定一个正数数组arr(即数组元素全是正数),找出该数组中,两个元素相减的最大值,其中被 减数的下标不小于减数的下标。即求出: maxValue = max{arr[j]-arr[i] and j >= i}?
4.Java实现求一个数组中不存在的最小正整数?
5.sql实现给定用户登录表,怎么查连续3天未登录的用户?
6.Java实现求一个数组中不存在的最小正整数?
7.给定注册表和登录表,用一个sql求1-7天留存?
8.用sql完成行转列,并统计某列数量前十?
9.Java如何实现数字反序?
10.Java如何使用线程池?

11.Java自己写个简单线程池?
12.Java实现生产者-消费者模式?
13.需求Demo代码实现:车辆信息查询?
14.统计List集合中指定元素的个数?

1.用Java实现一个函数把两个有序的int数组结合成新的有序数组?

可以使用归并排序的思想来实现这个函数。具体步骤如下:定义一个新的int数组,长度为两个输入数组的长度之和。
定义三个变量:i、j、k,分别表示两个输入数组和新数组的下标。
使用while循环,比较两个输入数组的元素大小,将较小的元素放入新数组中,并将对应下标加1。
如果其中一个输入数组已经遍历完了,就将另一个输入数组中剩余的元素全部加入新数组中。
返回新数组。
下面是Java代码实现:public static int[] merge(int[] arr1, int[] arr2) {int[] mergedArr = new int[arr1.length + arr2.length];int i = 0, j = 0, k = 0;while (i < arr1.length && j < arr2.length) {if (arr1[i] < arr2[j]) {mergedArr[k] = arr1[i];i++;} else {mergedArr[k] = arr2[j];j++;}k++;}while (i < arr1.length) {mergedArr[k] = arr1[i];i++;k++;}while (j < arr2.length) {mergedArr[k] = arr2[j];j++;k++;}return mergedArr;
}

2.用Java代码实现给a[n]数组进行全排序,找到一个组合的前一个组合,比如a[3]{[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]},给出[2,3,1,],找到他的前序是[2,1,3]?

以下是给数组进行全排列,并找到指定组合的前一个组合的Java代码实现:import java.util.Arrays;public class Permutation {public static void main(String[] args) {int[] a = {1, 2, 3};int[] prev = prevPermutation(a, new int[]{2, 3, 1});System.out.println(Arrays.toString(prev));}public static int[] prevPermutation(int[] a, int[] b) {int n = a.length;Arrays.sort(a); // 先将数组按升序排列,以便找到第一个组合int[] prev = null;do {if (Arrays.equals(a, b)) { // 找到指定组合break;}prev = Arrays.copyOf(a, n); // 记录当前组合a = nextPermutation(a); // 继续寻找下一个组合} while (a != null);return prev;}public static int[] nextPermutation(int[] a) {int n = a.length;int i = n - 2;while (i >= 0 && a[i] >= a[i + 1]) {i--;}if (i < 0) {return null;}int j = n - 1;while (j >= 0 && a[j] <= a[i]) {j--;}swap(a, i, j);reverse(a, i + 1, n - 1);return a;}public static void swap(int[] a, int i, int j) {int temp = a[i];a[i] = a[j];a[j] = temp;}public static void reverse(int[] a, int i, int j) {while (i < j) {swap(a, i++, j--);}}
}
运行结果为:[2, 1, 3]
其中,prevPermutation 方法实现了先将数组按升序排列,然后循环调用 nextPermutation 方法找到指定组合的前一个组合;nextPermutation 方法实现了上述字典序算法;swap 方法实现了交换数组中两个元素的功能;reverse 方法实现了翻转数组中指定范围内的元素的功能。

3.Java实现给定一个正数数组arr(即数组元素全是正数),找出该数组中,两个元素相减的最大值,其中被减数的下标不小于减数的下标。即求出: maxValue = max{arr[j]-arr[i] and j >= i}?

下面是Java的实现:public static int findMaxDiff(int[] arr) {int minVal = arr[0];int maxDiff = 0;for (int i = 1; i < arr.length; i++) {if (arr[i] < minVal) {minVal = arr[i];} else {int diff = arr[i] - minVal;if (diff > maxDiff) {maxDiff = diff;}}}return maxDiff;
}时间复杂度为 O(n),其中 n 是数组的长度。

4.Java实现求一个数组中不存在的最小正整数?

意思是给定一个整数数组,要求找到其中最小的正整数,这个正整数必须是在数组中不存在的。也就是说,如果数组中已经包含了所有的正整数,那么答案就是数组长度加 1。例如,对于数组 [1, 2, 0],答案为 3,因为 3 是该数组中不存在的最小正整数下面是Java的实现:public static int findMissingPositive(int[] nums) {int n = nums.length;// 将负数和大于 n 的数替换成 n+1for (int i = 0; i < n; i++) {if (nums[i] <= 0 || nums[i] > n) {nums[i] = n + 1;}}// 将正数对应的位置标记为负数for (int i = 0; i < n; i++) {int num = Math.abs(nums[i]);if (num <= n) {nums[num - 1] = -Math.abs(nums[num - 1]);}}// 找到第一个未被标记为负数的位置for (int i = 0; i < n; i++) {if (nums[i] > 0) {return i + 1;}}// 如果都被标记为负数,返回 n+1return n + 1;
}该算法的时间复杂度为 O(n),空间复杂度为 O(1)。

5.sql实现给定用户登录表,怎么查连续3天未登录的用户?

假设给定用户登录表的表名为 user_login,包含以下列:user_id: 用户ID
login_time: 登录时间(格式为日期时间类型)
则可以使用以下 SQL 语句查找连续三天未登录的用户:该 SQL 语句使用了一个子查询,将登录时间按照用户ID和时间顺序进行排序,并为每行分配一个行号。然后,外层查询使用 NOT EXISTS 子句来查找所有连续三天未登录的用户。具体地,对于每个用户和每个登录时间,检查下一个登录时间是否大于当前时间加上两天,如果是,则说明当前登录时间之后连续三天都没有登录,即该用户满足条件。需要注意的是,上述 SQL 语句中使用了窗口函数 ROW_NUMBER() 和日期函数 INTERVAL,因此需要确保数据库中支持这些函数。
SELECT user_id
FROM (SELECT user_id, login_time,ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY login_time) AS rnFROM user_login
) t1
WHERE NOT EXISTS (SELECT 1FROM (SELECT user_id, login_time,ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY login_time) AS rnFROM user_login) t2WHERE t2.user_id = t1.user_id AND t2.rn = t1.rn + 1 AND t2.login_time > t1.login_time + INTERVAL 2 DAY
)

6.sql实现给定每天收入明细数据,怎么查每天的历史收入总和?

可以使用SQL语句中的聚合函数SUM和GROUP BY来实现每天历史收入总和的查询。假设收入明细数据存在一个名为income的表中,其中包含日期(date)和收入金额(amount)两个字段,那么查询每天历史收入总和的SQL语句如下:以上SQL语句会按照日期(date)进行分组,然后对每组的收入金额(amount)进行求和(SUM),最后得出每天历史收入总和(total_income)。结果会按照日期升序排序(ORDER BY date ASC)。
SELECT date, SUM(amount) as total_income
FROM income
GROUP BY date
ORDER BY date ASC;

7.给定注册表和登录表,用一个sql求1-7天留存?

要求1-7天留存,需要用到登录表和注册表,其中登录表记录用户每天的登录情况,注册表记录用户注册的日期。假设登录表为login,注册表为register,其中login表包含用户ID(user_id)和登录日期(login_date)两个字段,register表包含用户ID(user_id)和注册日期(register_date)两个字段,则可以使用以下SQL语句计算1-7天留存:以上SQL语句使用了三个表的JOIN操作,分别是login表自连接,register表和login表的LEFT JOIN连接。其中,login表自连接是为了找到每个用户在第一天(注册当天)和第七天的登录记录,register表和login表的LEFT JOIN连接是为了保证每个注册用户都能被计算在留存率中。具体来说,SQL语句中的WHERE条件限制了查询的时间范围和用户登录的时间条件,查询的是从2022年1月1日到2022年1月7日每天的留存率。其中,l1.login_date = DATE_SUB(r.register_date, INTERVAL 1 DAY)表示在用户注册当天的前一天(即T-1)登录,l1.login_date BETWEEN '2022-01-01' AND '2022-01-07'表示在1-7天内的登录记录,r.register_date BETWEEN '2022-01-01' AND '2022-01-07'表示在1-7天内注册的用户。最后,将查询结果按照留存率(retention_rate)进行计算,即计算第7天的留存用户数除以第1天的注册用户数。
SELECT COUNT(DISTINCT l7.user_id) / COUNT(DISTINCT r.user_id) AS retention_rate
FROM login l1JOIN register r ON l1.user_id = r.user_idLEFT JOIN login l7 ON l1.user_id = l7.user_id AND DATEDIFF(l7.login_date, l1.login_date) = 6
WHERE l1.login_date = DATE_SUB(r.register_date, INTERVAL 1 DAY) ANDl1.login_date BETWEEN '2022-01-01' AND '2022-01-07' ANDr.register_date BETWEEN '2022-01-01' AND '2022-01-07';

8.用sql完成行转列,并统计某列数量前十?

要将行转列,可以使用SQL语句中的PIVOT操作,而要统计某列数量前十,可以使用SQL语句中的TOP操作或者LIMIT操作(不同数据库支持的语法可能有所不同)。下面给出一个例子来说明如何使用SQL完成行转列并统计数量前十的操作。假设有一个名为sales的表,其中包含销售记录,包括日期(date)、产品类型(product_type)和销售数量(quantity)三个字段,如下所示:复制
+------------+--------------+----------+
| date       | product_type | quantity |
+------------+--------------+----------+
| 2022-01-01 | A            | 10       |
| 2022-01-01 | B            | 20       |
| 2022-01-01 | C            | 30       |
| 2022-01-02 | A            | 15       |
| 2022-01-02 | B            | 25       |
| 2022-01-02 | C            | 35       |
| 2022-01-03 | A            | 12       |
| 2022-01-03 | B            | 22       |
| 2022-01-03 | C            | 32       |
+------------+--------------+----------+
要将产品类型(product_type)作为列,日期(date)作为行,而销售数量(quantity)作为值,并统计某列数量前十,可以使用以下SQL语句:SELECT date, [A], [B], [C]
FROM (SELECT date, product_type, quantityFROM sales
) AS s
PIVOT (SUM(quantity)FOR product_type IN ([A], [B], [C])
) AS p
ORDER BY date ASC;
以上SQL语句使用了PIVOT操作将产品类型(product_type)从行转列,并使用SUM函数对销售数量(quantity)进行求和。最后,使用ORDER BY语句按照日期升序排序。执行以上SQL语句将会得到以下结果:复制
+------------+----+----+----+
| date       | A  | B  | C  |
+------------+----+----+----+
| 2022-01-01 | 10 | 20 | 30 |
| 2022-01-02 | 15 | 25 | 35 |
| 2022-01-03 | 12 | 22 | 32 |
+------------+----+----+----+
如果要统计某列数量前十,可以在以上SQL语句的基础上再加上TOP操作或者LIMIT操作,例如:SELECT date, [A], [B], [C]
FROM (SELECT date, product_type, quantityFROM sales
) AS s
PIVOT (SUM(quantity)FOR product_type IN ([A], [B], [C])
) AS p
ORDER BY [A] DESC
LIMIT 10;
以上SQL语句会将A列的值按照降序排列,然后取前十行。如果使用的是支持TOP操作的数据库,可以将LIMIT操作替换为TOP操作,例如:SELECT TOP 10 date, [A], [B], [C]
FROM (SELECT date, product_type, quantityFROM sales
) AS s
PIVOT (SUM(quantity)FOR product_type IN ([A], [B], [C])
) AS p
ORDER BY [A] DESC;
以上SQL语句会将A列的值按照降序排列,然后取前十行。

9.Java如何实现数字反序?

Java实现数字反序的方法有多种,下面介绍其中两种比较常见的方法:使用字符串反转方法
可以将数字先转换成字符串,然后再通过字符串反转方法将其反转,最后再将反转后的字符串转换成数字即可。示例代码:public static int reverse(int num) {String str = String.valueOf(num);String reverseStr = new StringBuilder(str).reverse().toString();return Integer.parseInt(reverseStr);
}
使用数学运算
可以通过对数字进行取模和除法运算,将数字的每一位逐个提取出来,然后再组合成反转后的数字。示例代码:public static int reverse(int num) {int reverseNum = 0;while (num != 0) {int digit = num % 10;reverseNum = reverseNum * 10 + digit;num /= 10;}return reverseNum;
}
这两种方法都可以实现数字反序的功能,选择哪种方法取决于具体的场景和个人喜好。

10.Java如何使用线程池?

Java中实现线程池的方式比较简单,可以通过ThreadPoolExecutor类来完成,具体实现步骤如下:创建ThreadPoolExecutor对象,可以通过构造方法或者Executors工厂类提供的静态方法来创建。ThreadPoolExecutor threadPool = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, TimeUnit.SECONDS, workQueue);
其中,corePoolSize表示核心线程数,maximumPoolSize表示最大线程数,keepAliveTime表示线程空闲时间,TimeUnit.SECONDS表示时间单位,workQueue表示任务队列。提交任务到线程池中,可以通过execute方法或者submit方法来提交任务。threadPool.execute(new Runnable() {@Overridepublic void run() {// 任务逻辑}
});
关闭线程池,可以通过shutdown方法来关闭线程池。threadPool.shutdown();完整示例代码如下:import java.util.concurrent.*;public class ThreadPoolDemo {public static void main(String[] args) {// 创建线程池ThreadPoolExecutor threadPool = new ThreadPoolExecutor(2, 5, 1, TimeUnit.SECONDS, new ArrayBlockingQueue<>(10));// 提交任务for (int i = 0; i < 10; i++) {threadPool.execute(new Runnable() {@Overridepublic void run() {System.out.println(Thread.currentThread().getName() + " start");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName() + " end");}});}// 关闭线程池threadPool.shutdown();}
}
在上面的示例代码中,我们创建了一个线程池,设置了核心线程数为2,最大线程数为5,任务队列大小为10,然后提交了10个任务到线程池中执行,最后关闭了线程池。

11.Java自己写个简单线程池?

自己实现一个简单的线程池,可以通过以下步骤完成:定义一个任务接口Task,用来表示需要执行的任务。public interface Task {void execute();
}
定义一个工作线程类WorkerThread,用来执行任务。public class WorkerThread extends Thread {private final BlockingQueue<Task> taskQueue;public WorkerThread(BlockingQueue<Task> taskQueue) {this.taskQueue = taskQueue;}@Overridepublic void run() {while (!Thread.currentThread().isInterrupted()) {try {Task task = taskQueue.take();task.execute();} catch (InterruptedException e) {Thread.currentThread().interrupt();}}}
}
定义一个线程池类ThreadPool,用来管理线程池。public class ThreadPool {private final int nThreads;private final BlockingQueue<Task> taskQueue;private final List<WorkerThread> threads = new ArrayList<>();public ThreadPool(int nThreads, int queueSize) {this.nThreads = nThreads;taskQueue = new LinkedBlockingQueue<>(queueSize);for (int i = 0; i < nThreads; i++) {WorkerThread workerThread = new WorkerThread(taskQueue);threads.add(workerThread);workerThread.start();}}public void execute(Task task) throws InterruptedException {taskQueue.put(task);}public void shutdown() {for (WorkerThread thread : threads) {thread.interrupt();}}
}
在上面的代码中,我们使用BlockingQueue来存储任务队列,用WorkerThread来执行任务,使用ThreadPool来管理线程池。使用线程池来执行任务。public class Main {public static void main(String[] args) throws InterruptedException {ThreadPool threadPool = new ThreadPool(5, 10);for (int i = 0; i < 20; i++) {int taskId = i;threadPool.execute(new Task() {@Overridepublic void execute() {System.out.println("Task " + taskId + " is running on thread " + Thread.currentThread().getName());try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}});}threadPool.shutdown();}
}
在上面的代码中,我们使用自己实现的线程池来执行20个任务,每个任务需要执行1秒钟,最后关闭线程池。注意,这个自己实现的线程池只是一个简单的示例,没有考虑线程池的扩展性、性能等问题。在实际应用中,建议使用Java提供的线程池实现。

12.Java实现生产者-消费者模式?

生产者-消费者是一个经典的多线程编程问题,Java提供了多种实现方式,下面给出一种基于wait()和notify()方法的实现:public class ProducerConsumer {private List<Integer> buffer = new ArrayList<>();private int maxSize = 5;public void produce() throws InterruptedException {synchronized (this) {while (buffer.size() == maxSize) {wait();}Random random = new Random();int number = random.nextInt(100);buffer.add(number);System.out.println("生产者生产了:" + number);notifyAll();}}public void consume() throws InterruptedException {synchronized (this) {while (buffer.size() == 0) {wait();}int number = buffer.remove(0);System.out.println("消费者消费了:" + number);notifyAll();}}
}
在这个例子中,生产者和消费者共享一个缓冲区,当缓冲区满时,生产者会调用wait()方法等待,当缓冲区为空时,消费者会调用wait()方法等待。当生产者生产一个数据时,会调用notifyAll()方法通知所有等待的线程,消费者消费一个数据时也会调用notifyAll()方法通知所有等待的线程。需要注意的是,wait()和notify()方法必须在同步代码块内调用,否则会抛出IllegalMonitorStateException异常。

13.需求Demo代码实现:车辆信息查询?


需求Demo代码实现:车辆信息查询步骤一:【Car.jsp】页面,车辆号牌下方增加【车辆信息查询】按钮,onclick方法:【submitCarInfo()】<td class="bgc_tt short">车辆号牌</td><td class="long"><!-- 如果车的损失类型为001,则显示车辆信息查询按钮 --><s:if test="${car.lossType == '001'}"><input type="button" class="button_ty" name="carInfo" value="车辆信息查询" onclick="submitCarInfo();"/></s:if>	</td>步骤二:【carcar.js】js文件写了方法:【submitCarInfo()】显示车辆信息查询//显示车辆信息查询function submitCarInfo(){	 var registNo = fm.all("car.registNo").value;var licenseNo = fm.all("car.licenseNo").value;if(licenseNo==null||licenseNo==""){alert("车牌号必须录入");return false;}if(licenseType!=null && licenseType!=""){window.open(contextRootPath+"/car/findCarInfo.do?registNo="+registNo+"&licenseNo="+licenseNo,"newwin","scrollbars=yes,resizable=yes,width=900,Height=700");        }else{alert("录入车牌号时,车牌号必录");return false;}		}步骤三:【struts-car.xml】配置文件决定了跳转到哪个Action哪个方法<!-- 车辆信息查询 --><action name="findCarInfo" class="carAction" method="findCarInfo"><result name="success">/pages/car/CarInfo.jsp</result></action>步骤四:【CarAction】里的成员变量因为框架的原因可以直接前后端共享public class CarAction extends Struts2Action {private String registNo;private String licenseNo;private List<findCarInfoVo> CarInfoList;//getter和setter方法	//车辆信息查询/** 预填三者车信息 */public String getfindCarInfo(){String[] CarInfoArray=new String[10];CarInfoArray[CarInfoConstants.COUNT_REGISTNO]= registNo;CarInfoArray[CarInfoConstants.COUNT_LICENSENO]= licenseNo;CarInfoList = CarService.findCarInfo(CarInfoArray);return SUCCESS;}
}步骤五:配置常量工具类【CarInfoConstants】
用到的常量和通过Map实现字段转换public class CarInfoConstants {public static final int COUNT_REGISTNO = 0;public static final int COUNT_LICENSENO = 1;/*** 车身颜色对应map*/public static final HashMap<String,String> PRO_COLOR_MAP = new HashMap<String,String>();static{PRO_COLOR_MAP.put("001","白");PRO_COLOR_MAP.put("002","灰");PRO_COLOR_MAP.put("003","黄");}/*** 车辆种类对应map*/public static final HashMap<String,String> CarTYPE_MAP = new HashMap<String,String>();static{CarTYPE_MAP.put("11","六座以下客车");CarTYPE_MAP.put("12","六座至十座客车");CarTYPE_MAP.put("13","十座至二十座以下客车"); 	}public static final HashMap<String,String> LICENSETYPE_MAP = new HashMap<String,String>();//前面是平台,后面是公司static{LICENSETYPE_MAP.put("01","大型汽车号牌");LICENSETYPE_MAP.put("02","小型汽车号牌");LICENSETYPE_MAP.put("03","使馆汽车号牌");}public static final HashMap<String,String> COMPANY_MAP = new HashMap<String,String>();static{COMPANY_MAP.put("AAIC","安信农业保险股份有限公司");COMPANY_MAP.put("ABIC","安邦财产保险股份有限公司");COMPANY_MAP.put("ACIC","安诚财产保险股份有限公司");}/*** 解析报文号牌种类转换map*/public static final HashMap<String,String> LICTYPE_TOPLATFORM_MAP = new HashMap<String,String>();//前面是公司,后面是平台static{LICENSETYPE_MAP.put("24","99");LICENSETYPE_MAP.put("28","26");LICENSETYPE_MAP.put("29","27");}
}步骤六:【CarServiceSpringImpl】
generateRandomString():获取23位随机数的方法.前14位是年月日时分秒
findCarInfo():车辆信息查询请求报文和接收响应报文的方法
findClaimCodeByRegistNo():获取理赔编码方法public class CarServiceSpringImpl extends GenericDaoHibernate<PrpLCar, Long>implements CarService {//获取23位随机数.前14位是年月日时分秒//后3位是0,后5位是截取uuid随机数public static String generateRandomString() {SimpleDateFormat format = new SimpleDateFormat();format.applyPattern("yyyyMMddHHmmss");String currentTime = format.format(new Date());int randomInt = Math.abs(new Random().nextInt(Integer.MAX_VALUE));String ctm = String.valueOf(System.currentTimeMillis());String ms = ctm.substring(ctm.length() - 6, ctm.length());StringBuffer randomString = new StringBuffer();randomString.append(currentTime);// 14位randomString.append("000");// 3个0String uuid = UUID.generate().toString().replace("-", "");//32位默认长度的uuidif (uuid.length() > 8) {randomString.append(uuid.substring(uuid.length()-5,uuid.length()));//截取后5位}randomString.append(randomInt);return randomString.substring(0, 23);}/**车辆信息查询*/public List<findCarInfoVo> findCarInfo(String[] carArray)  {String registNo = CarInfoArray[CarInfoConstants.COUNT_REGISTNO];		List<PrpLcMain> cMainList = carService.findLcMainByRegistNo(registNo);String basicComCode = cMainList.get(0).getComCode(); // 机构代码 String provinceCode = null;        if (basicComCode != null && basicComCode.length() >= 4) {//先判断特殊城市if(basicComCode.startsWith("1101")){provinceCode  = "1100";//北京}else if(basicComCode.startsWith("1102")){provinceCode  = "1200";//上海}else{provinceCode = basicComCode.substring(0,2);//因为要考虑二级机构,其它省份截取2位}}			String servertype = "carInfo_" + provinceCode;RequestProFillVo requestProFillVo = new RequestProFillVo();IpServiceConfigDto ipServiceConfigDto =IpSelectAction.getIpInfoBeanByKeyAndNetType(servertype, "0");if(ipServiceConfigDto!=null){//获取账号String userCode = ipServiceConfigDto.getAppUserName();requestProFillVo.setUserCode(userCode);//获取密码String password = ipServiceConfigDto.getAppPassword();String md5PassWord =MD5.ecodeByMD5(password, "UTF-8");requestProFillVo.setPassWord(md5PassWord);}String createCode = CarServiceSpringImpl.generateRandomString();requestProFillVo.setCreateCode(createCode);String policyNo = CarInfoArray[CarInfoConstants.COUNT_POLICYNO];List<CarClaimCode> CarClaimCodeList = null;if(null != cMainList && cMainList.size()!=0){if(cMainList.size()>1){//CarClaimCodeList = findClaimCodeByRegistNo(cMainList.get(0).getRegistNo(),cMainList.get(0).getPolicyNo());if(CarClaimCodeList !=null && CarClaimCodeList.get(0).getClaimCode()!=null){requestProFillVo.setClaimsequenceNo(CarClaimCodeList.get(0).getClaimCode());//理赔编码}requestProFillVo.setPlatType("01");}//通过寻找上级机构方法找到二级机构代码,然后经过转换获得平台要的String secondComCode = codeService.getComCode(basicComCode);String areaCode = secondComCode.substring(0, 6);//确定下这个代码长度几位,平台要求的长度是6位		requestProFillVo.setAreaCode(areaCode);}//2.发送报文地址String findCarInfoUrl = ipServiceConfigDto.getProteclType()+ipServiceConfigDto.getServerIp()+":"+ipServiceConfigDto.getServerPort()+"/"+ipServiceConfigDto.getMethods();	String postJson = null;ProResponseInfo proResponseInfo = null;InsuranceDataVo insuranceDataVo = null;List<InsuranceDataVo> carDataList = null;VehicleDataVo vehicleDataVo = null;findCarInfoVo findCarInfoVo=null;List<findCarInfoVo> CarInfoList = new ArrayList<findCarInfoVo>();String json = JsonUtil.toJson(requestProFillVo);//发送请求报文try {postJson = HttpUtil.sendJSONRequest(findCarInfoUrl,json);//解析响应报文proResponseInfo = JsonUtil.fromJson(postJson, ProResponseInfo.class);		if(proResponseInfo != null && proResponseInfo.getInsuranceData() != null && proResponseInfo.getVehicleData() != null ){carDataList = proResponseInfo.getInsuranceData();							for (int i = 0; i < carDataList.size(); i++) {insuranceDataVo = carDataList.get(i);findCarInfoVo = new findCarInfoVo();licenseType = insuranceDataVo.getLicenseType();									findCarInfoVo.setLicenseType(CarInfoConstants.LICENSETYPE_MAP.get(licenseType));				findCarInfoVo.setLicenseNo(insuranceDataVo.getLicenseNo());					CarInfoList.add(findCarInfoVo);}}else{System.out.println("报错:返回报文数据缺失");}} catch (Exception e) {e.printStackTrace();System.out.println("此次交互报错!!!");			} return CarInfoList;}/***  车辆信息查询获取理赔编码方法*/public List<CarClaimCode> findClaimCodeByRegistNo(String registNo,String policyNo){String sql = "select a from CarClaimCode a where a.id.registNo = ? and a.id.policyNo = ? ";List<CarClaimCode> carClaimList =super.findByHql(sql.toString(),registNo,policyNo);return carClaimList;}步骤七:【HttpUtil】是工具类里面新增一个JSON格式请求平台的工具方法public class HttpUtil {public static String sendJSONRequest(String urlpath, String jsonstr){URL url;OutputStream outputStream = null;OutputStreamWriter writer = null;InputStream inputStream = null;BufferedReader reader = null;StringBuffer buffer = new StringBuffer();String strMessage = "";String result = null;HttpURLConnection httpConn = null;try {url = new URL(urlpath);// 接口地址httpConn = (HttpURLConnection) url.openConnection();httpConn.setDoInput(true);httpConn.setDoOutput(true);httpConn.setRequestMethod("POST");httpConn.setReadTimeout(30000);// 读取数据时间httpConn.setConnectTimeout(30000);// 连接超时httpConn.setAllowUserInteraction(true);httpConn.setRequestProperty("Content-type", "application/json");httpConn.connect();outputStream = httpConn.getOutputStream();writer = new OutputStreamWriter(outputStream, "UTF-8");// 解决特殊字符转码乱码问题jsonstr = jsonstr.replaceAll("%2F", "/").replaceAll("%3A", ":").replaceAll("%3F", "?").replaceAll("%3D", "=").replaceAll("%26", "&").replaceAll("%7D", "}").replaceAll("%7B", "{").replaceAll("%22", "\"").replaceAll("%2C", ",").replaceAll("%5C", "").replaceAll("%2B","+").replaceAll("%5B", "[");writer.write(jsonstr);writer.flush();writer.close();inputStream = httpConn.getInputStream();reader = new BufferedReader(new InputStreamReader(inputStream,"UTF-8"));while ((strMessage = reader.readLine()) != null) {buffer.append(strMessage);}if (buffer.length() < 1) {throw new Exception("接口返回异常");}result = URLDecoder.decode(buffer.toString(), "UTF-8");} catch (Exception e) {System.out.println("输出异常");e.printStackTrace();}finally {try {if (reader != null) {reader.close();}if(outputStream!=null){outputStream.close();}if(inputStream!=null){inputStream.close();}if(httpConn!=null){httpConn.disconnect();}} catch (IOException e) {e.printStackTrace();}}return result;    }
}步骤八:【carcar.js】js文件写了方法:【showBackCarInfo()】子页面信息回显父页面function showBackCarInfo(){var isCar = document.getElementsByName("isCar");var CarInfoList="";var registNo="";for(var i=0;i<isCar.length;i++){if(isCar[i].Cared ==true){var licenseNo=document.getElementById("CarInfoList["+i+"].licenseNo").value;if(window.parent.opener.document.all("CarInfo.licenseNo").value == null || window.parent.opener.document.all("CarInfo.licenseNo").value == ""){window.parent.opener.document.all("CarInfo.licenseNo").value = licenseNo;}  }    }window.close();}步骤九:
14.【CarInfo.jsp】页面展示车辆查询的信息<%@ page contentType="text/html;charset=GBK"%>
<%@ include file="/common/taglibs.jsp"%>
<%@ include file="/common/i18njs.jsp"%>
<%@ include file="/common/meta_css.jsp"%>
<html>
<head>
<title>车辆信息查询</title>
<script language="Javascript" src="${ctx}/pages/car/car.js"></script>
</head>
<body id="all_title">
<div id="wrapper">
<div id="container">
<div id="crash_menu">
<h2>车辆预填信息</h2>
</div><br><br><table class="fix_table"><tr class="sort"><th width="50px">选择</th><th>号牌种类</td><th>号牌号码</td></tr><s:if test="${messageSize==0}"><br><br><tr class="sort"><td colspan="6">暂无记录</td></tr></s:if><s:else><s:iterator status="status" value="carInfoList"><tr class="sort"><td> <input  type="radio" align="center" name="isCheck" /> </td><td align="center"><s:property value="%{carInfoList[#status.index].licenseType}"/></td><td align="center"><s:property value="%{carInfoList[#status.index].licenseNo}" /></td><s:hidden value="%{carInfoList[#status.index].licenseType}" id ="%{'carInfoList['+#status.index+'].licenseType'}"/><s:hidden value="%{carInfoList[#status.index].licenseNo}" id ="%{'carInfoList['+#status.index+'].licenseNo'}"/></tr><tr class="sort"></tr>	</s:iterator></s:else></table><br><br><div align="center"><input type="button"  value="确认"  class="button_ty" onclick="showBackCarInfo();"  onclick="window.close();"></div>
</body><%@ include file="/common/meta_js.jsp"%>
</html>

14.统计List集合中指定元素的个数?

实际应用场景:需要统计List集合中指定元素的个数,不想遍历
可以利用Bag包下的getCount()进行统计,代码如下:/*** @Description 统计list中重复元素个数*/private void countEqualElement(List<String> list) {Bag bag = new HashBag(list);// 相同元素集合Set<String> equalElesSet = new HashSet<String>();// 相同元素String equalElement = "";for (int i = 0; i < list.size(); i++) {equalElement = list.get(i);// 利用hashBag的getCount()方法进行统计重复元素个数int count = bag.getCount(equalElement);if (count > 1) {// 保存重复元素equalElesSet.add(equalElement);}}if (equalElesSet.size() > 0) {// 相同元素个数int length = equalElesSet.size();System.out.println("重复元素组数:" + length);// 输出相同元素Iterator<String> it = equalElesSet.iterator();int count = 1;while (it.hasNext()) {String next = it.next();System.out.println("第" + count + "个重复元素:" + next);count++;}}}

更多推荐

【代码实战】精品面试题14道

本文发布于:2024-02-17 15:28:38,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1694509.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:实战   面试题   代码   精品

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!