java組合模式:樹形結構:
用遞回列印出下面的樹形結構(不能硬編碼,提示:先定義出樹型資料結構):

package 樹形結構;
/**
* @author ${范濤之}
* @Description
* @create 2021-11-04 8:18
*/
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Tree {
/**
* 添加節點
* @param nodeMap
* @param parentNodeName 父節點名稱
* @param nodeName
*/
public static void addNode(Map<String,Node> nodeMap,String parentNodeName,String nodeName){
Node parentNode = null != parentNodeName ? nodeMap.get(parentNodeName) : null;
Node node = nodeMap.get(nodeName);
if(null != node){
return;
}
node = new Node();
node.setName(nodeName);
nodeMap.put(nodeName, node);
if(null != parentNode){
parentNode.addChild(node);
node.setParent(parentNode);
}
}
public static void main(String[] args) throws IOException {
String [] arrays = new String[]{
"中國/北京市/朝陽區",
"中國/北京市/海淀區",
"中國/湖北省/武漢市/江漢區",
"中國/湖北省/武漢市/江廈區",
"中國/湖南省/長沙市",
"中國/湖南省/株洲市",
"美國/加利福尼亞州",
"美國/德克薩斯州",
};
Map<String,Node> resultMap = new HashMap<String,Node>();
for(String line : arrays){
String nodeNameArray [] = line.split("/");
String preNodeName = null;
for(String curNodeName : nodeNameArray){
addNode(resultMap,preNodeName,curNodeName);
preNodeName = curNodeName;
}
}
for(Map.Entry<String,Node> entry : resultMap.entrySet()){
Node node = entry.getValue();
if(null == node.getParent()){
print(node,"");
}
}
}
/**
* 遞回列印node
* @param node
* @param blank
*/
public static void print(Node node,String blank){
System.out.println(blank + node.getName());
if(node.getChilds() == null || node.getChilds().isEmpty()){
return;
}
for(Node cur : node.getChilds()){
print(cur,blank + " ");
}
}
static class Node{
private String name;
private int index;
private List<Node> childs;
private Node parent;
public List<Node> getChilds() {
return childs;
}
public void addChild(Node child) {
if(null == childs){
childs = new ArrayList<Node>();
}
childs.add(child);
}
public Node getParent() {
return parent;
}
public void setParent(Node parent) {
this.parent = parent;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getIndex() {
return index;
}
public void setIndex(int index) {
this.index = index;
}
}
}
結果:
用回呼實作下面這兩種常見的生活場景:
張偉在超市買了一瓶快樂水和一些吃的,使用支付 APP 完成支付后,過了幾秒,APP 通知他已經支付成功:
首先講解一下java延遲函式的使用:
在Java中有時候需要使程式暫停一點時間,稱為延時,普通延時用Thread.sleep(int)方法,這很簡單,把它將當前執行緒掛起指定的毫秒數,如
try
{
Thread.sleep(1000);//單位:毫秒
} catch (Exception e) {
}
注意:Thread.sleep(int)不能直接用,要做例外處理,try{}catch{}.
在這里需要解釋一下執行緒沉睡的時間,sleep()方法并不能夠讓程式"嚴格"的沉睡指定的時間,例如當使用5000作為sleep()方法的引數時,線 程可能在實際被掛起5000.001毫秒后才會繼續運行,當然,對于一般的應用程式來說,sleep()方法對時間控制的精度足夠了,
但是如果要使用精確延時,最好使用Timer類:
Timer timer=new Timer();//實體化Timer類
timer.schedule(new TimerTask(){
public void run(){
System.out.println("退出");
this.cancel();}},500);//五百毫秒
原始碼實作:
package 支付通知;
import java.util.Scanner;
import java.util.Timer;
import java.util.TimerTask;
/**
* @author ${范濤之}
* @Description
* @create 2021-11-04 8:56
*/
// 張偉在超市買了一瓶快樂水和一些吃的,使用支付 APP 完成支付后,過了幾
// 秒,APP 通知他已經支付成功
public class PayTest {
public static void main(String[] args) {
System.out.println("請輸入支付密碼:");
delay(pay());
}
// 使用APP付款
public static boolean pay(){
Scanner scanner = new Scanner(System.in);
int number = scanner.nextInt();
if (number == 123456)
return true;
else
return false;
}
// 延遲函式撰寫:
public static void delay(boolean number){
Timer timer = new Timer();
if (number) {
System.out.println("正在支付中......");
timer.schedule(new TimerTask() {
@Override
public void run() {
System.out.println("支付成功");
this.cancel();
}
}, 5000);
}
else {
System.out.println("正在支付中......");
timer.schedule(new TimerTask() {
@Override
public void run() {
System.out.println("支付失敗,密碼錯誤!");
this.cancel();
}
}, 5000);
}
}
}
結果如圖:


李雷周一在某某寶 APP 上買了兩張周五晚上的電影票,在周五晚上電影即將放映的前一小時,APP 給他發來了觀影通知
這里我一開始和上面那道題的做法差不多但是后來讀題認為還是有差距的,上面的支付寶只需要延遲幾秒后支付成功即可但是這道題應該涉及到了java定時任務,也就是java.util.Timer 這個類的使用:下面先講解一些這個類
import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
public class Test {
public static void main(String[] args) {
//timer1();
timer2();
//timer3();
//timer4();
}
// 第一種方法:設定指定任務task在指定時間time執行 schedule(TimerTask task, Date time)
public static void timer1() {
Timer timer = new Timer();
timer.schedule(new TimerTask() {
public void run() {
System.out.println("-------設定要指定任務--------");
}
}, 2000);// 設定指定的時間time,此處為2000毫秒
}
// 第二種方法:設定指定任務task在指定延遲delay后進行固定延遲peroid的執行
// schedule(TimerTask task, long delay, long period)
public static void timer2() {
Timer timer = new Timer();
timer.schedule(new TimerTask() {
public void run() {
System.out.println("-------設定要指定任務--------");
}
}, 1000, 1000);
}
// 第三種方法:設定指定任務task在指定延遲delay后進行固定頻率peroid的執行,
// scheduleAtFixedRate(TimerTask task, long delay, long period)
public static void timer3() {
Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
public void run() {
System.out.println("-------設定要指定任務--------");
}
}, 1000, 2000);
}
// 第四種方法:安排指定的任務task在指定的時間firstTime開始進行重復的固定速率period執行.
// Timer.scheduleAtFixedRate(TimerTask task,Date firstTime,long period)
public static void timer4() {
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, 12); // 控制時
calendar.set(Calendar.MINUTE, 0); // 控制分
calendar.set(Calendar.SECOND, 0); // 控制秒
Date time = calendar.getTime(); // 得出執行任務的時間,此處為今天的12:00:00
Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
public void run() {
System.out.println("-------設定要指定任務--------");
}
}, time, 1000 * 60 * 60 * 24);// 這里設定將延時每天固定執行
}
}
然后說一下這道題:
package 觀影通知;
import java.util.*;
/**
* @author ${范濤之}
* @Description
* @create 2021-11-04 9:26
*/
//李雷周一在某某寶 APP 上買了兩張周五晚上的電影票,在周五晚上電影即將 放映的前一小時,APP 給他發來了觀影通知
public class Movie {
public static void main(String[] args) {
System.out.println("請選擇你要購買的電影票:1:靈籠 2:第七夜");
delay();
}
public static int pay(){
Scanner scanner = new Scanner(System.in);
int r = scanner.nextInt();
if (r==1){
System.out.println("你選擇了電影:靈籠,放映前一小時將會通知您");
return 1;
}else
System.out.println("你選擇了電影:第七夜,放映前一小時將會通知您");
return 2;
}
public static void delay(){
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, 10); // 控制時
calendar.set(Calendar.MINUTE, 36); // 控制分
calendar.set(Calendar.SECOND, 0); // 控制秒
Date time = calendar.getTime(); // 得出執行任務的時間,此處為今天的10:36:00
Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
public void run() {
if (pay()==1) {
System.out.println("請八點準時在新穎影院觀看電影:靈籠");
}
else {
System.out.println("請八點準時在新穎影院觀看電影:第七夜");
}
}
}, time, 1000 * 60 * 60 * 24);// 這里設定將延時每天固定執行
}
}
結果如圖:
我們可以看到我可以定時發送訊息,也就意味著如果八點開始放映,那么我可以七點發送通知

韓梅梅周末在家休息,她把衣服丟到洗衣機里之后就去掃地、做飯去了,過了一會,洗衣機就「嘀~嘀~」響幾聲通知她衣服已經洗好了
其實這個很簡單,只有一個延遲函式,將用戶輸入的小時整數先轉化為秒(乘以1000)然后轉換為小時:乘以3600如圖:

代碼實作:
package 洗衣服;
import java.util.Scanner;
import java.util.Timer;
import java.util.TimerTask;
/**
* @author ${范濤之}
* @Description
* @create 2021-11-04 14:42
*/
//韓梅梅周末在家休息,她把衣服丟到洗衣機里之后就去掃地、做飯去了,過了一會,洗衣機就「嘀~嘀~」響幾聲通知她衣服已經洗好了
public class Clean {
public static void main(String[] args) {
System.out.println("請輸入洗衣服的時長,請輸入以小時為單位的整數");
delay();
}
public static int time(){
Scanner scanner = new Scanner(System.in);
int time = scanner.nextInt();
return time*1000*3600;
}
public static void delay(){
Timer timer = new Timer();
timer.schedule(new TimerTask() {
public void run() {
System.out.println("嘀嘀嘀......嘀嘀嘀......嘀嘀嘀");
}
}
, time());
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/348384.html
標籤:其他
