日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

java关于泛型的实验代码_[ Java学习 ] 泛型类的应用实验

發(fā)布時(shí)間:2023/12/19 java 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java关于泛型的实验代码_[ Java学习 ] 泛型类的应用实验 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

成文原因:

這篇文章是我這周所做的 Java 實(shí)驗(yàn)題的一個(gè)小總結(jié)。

這次實(shí)驗(yàn)讓我深刻贊同了我們 Java 老師在這節(jié)實(shí)驗(yàn)課前告訴我們的話:

最重要的是把問題想明白,它要怎么拆分成幾個(gè)類,每個(gè)類里究竟需要哪些方法,具體細(xì)節(jié)怎么實(shí)現(xiàn)。當(dāng)你真正把這些問題想清楚了以后,剩下的編程,其實(shí)就是很簡單的事情了。難度往往不是難在編程,而是分解問題為一個(gè)個(gè)小問題后,逐一解決它們的能力。

做完實(shí)驗(yàn)以后再來看老師這句話,覺得不能同意更多。

我貼上來的代碼有兩份。

前一份是未完成的代碼,之所以未完成,是因?yàn)?#xff1a;寫到一半時(shí),覺得這樣的結(jié)構(gòu)設(shè)計(jì)太不合理了,如果照著這么寫下去,會(huì)有許多重復(fù)的代碼片段不斷地出現(xiàn),于是就想著這么去改進(jìn)…怎樣才能盡可能減少方法,但是提高代碼的復(fù)用性呢?

于是,果斷放棄了前一種沒寫完的,不太優(yōu)的結(jié)構(gòu),第二份代碼才是寫完時(shí)真正提交的最終版本。

除了代碼,我把實(shí)驗(yàn)報(bào)告的心得部分也一并貼了上來用以自警

-------------------------------下面是實(shí)驗(yàn)題目------------------------------

-------------------------------下面是代碼------------------------------

/*

前一份是未完成的代碼,之所以未完成,是因?yàn)?#xff1a;寫到一半時(shí),覺得這樣的結(jié)構(gòu)設(shè)計(jì)太不合理了,如果照著這么寫下去,會(huì)有許多重復(fù)的代碼片段不斷地出現(xiàn),于是就想著這么去改進(jìn)…怎樣才能盡可能減少方法,但是提高代碼的復(fù)用性呢?

于是,果斷放棄了前一種沒寫完的,不太優(yōu)的結(jié)構(gòu),第二份代碼才是寫完時(shí)真正提交的最終版本。

*/

import java.util.ArrayList;

import java.util.LinkedList;

import java.util.*;

class Customer

{

private String name;

private String fNum; // flight number,表示他所定的航線的航線號(hào)

private int sum; //買了多少票

Customer()

{

}

Customer(String n, String f, int s)

{

name = n;

fNum = f;

sum = s;

}

public void setName(String n)

{

name = n;

}

public String getName()

{

return name;

}

public void setSum(int s)

{

sum = s;

}

public int getSum()

{

return sum;

}

public void setfNum(String f)

{

fNum = f;

}

String getfNum()

{

return fNum;

}

}

class Flight

{

private static int sum = 0; //航線計(jì)數(shù)

private int order; //航線排列號(hào)

private String destination;//終點(diǎn)站名

private String FNum; //航班號(hào)

private int limit; //乘客限額

private int free; //余票數(shù)量

private LinkedList booked; //已預(yù)定客戶列表

private LinkedList waiting; //等候替補(bǔ)客戶名單

Flight()

{

}

Flight(int o, String d, String F, int l)

{

order = o;

destination = d;

FNum = F;

limit = l;

}

public int getOrder()

{

return order;

}

public String getDestination()

{

return destination;

}

public String getFNum()

{

return FNum;

}

public int getLimit()

{

return limit;

}

public int getFree()

{

return free;

}

public void addFree(int f)

{

free += f;

}

public void subFree(int f)

{

free -= f;

}

public LinkedList getBooked()

{

return booked;

}

public LinkedList getWaiting()

{

return waiting;

}

public void showInfo() //show information

{

System.out.println("航線排列號(hào)為:" + order + " 終點(diǎn)站為:" + destination);

System.out.println("航班號(hào)為:" + FNum + " 成員定額為: " + limit + " 剩余票數(shù)為: " + free);

System.out.println("已訂票客戶有:");

Iterator it = booked.iterator();

for (; it.hasNext(); )

{

System.out.println(it.next().getName() + " ");

}

System.out.println();

System.out.println("等候替補(bǔ)客戶有:");

for ( it = waiting.iterator(); it.hasNext(); )

{

System.out.println(it.next().getName() + " ");

}

System.out.println();

}

}

class Menu

{

private ArrayList flights;

Flight temp;

public void init()

{

Flight f = new Flight(1, "北京","K2", 20);

flights.add(f);

f = new Flight(2, "北京","K3", 23);

flights.add(f);

f = new Flight(3, "成都","K4", 25);

flights.add(f);

}

public void addFlight(Flight flight) //加入一條航線

{

flights.add(flight);

}

public void query() //查詢

{

Scanner in = new Scanner(System.in);

int order = in.nextInt(); //次序

Flight temp;

Iterator it = flights.iterator();

for ( ; it.hasNext(); )

{

temp = it.next();

if (temp.getOrder() == order)

{

temp.showInfo();

return;

}

}

System.out.println("沒有檢索到相關(guān)信息");

}

public void book() //訂票

{

System.out.println("請(qǐng)輸入航班號(hào),您的姓名,以及您想要訂購的票數(shù)");

Scanner in = new Scanner(System.in);

Flight temp;

String tp, tp1; //tp 為航班號(hào),tp1為姓名

int tem; // temporary

tp = in.next();

tp1 = in.nextLine();

tem = in.nextInt();

Customer c = new Customer(tp1, tp, tem); //構(gòu)造函數(shù)參數(shù)依次為:姓名、 航線號(hào)、 所購票數(shù)

Iterator it = flights.iterator();

Flight temp;

for ( ; it.hasNext(); )

{

temp = it.next();

if (temp.getFNum() == tp)

{

if (temp.getFree() >= tem)

{

temp.subFree(tem);

temp.getBooked().add(c);

System.out.println("購票成功");

}

else

{

temp.getWaiting().add(c);

System.out.println("抱歉,票數(shù)暫時(shí)不夠!");

}

return;

}

}

System.out.println("輸入的航線不存在!");

}

public void cancel() //退票

{

System.out.println("請(qǐng)輸入航班號(hào),您的姓名,以及您想要退票的票數(shù)");

Scanner in = new Scanner(System.in);

Flight temp;

String tp, tp1; //tp 為航班號(hào),tp1為姓名

int tem; // temporary

tp = in.next();

tp1 = in.nextLine();

tem = in.nextInt();

Iterator it = flights.iterator();

Flight temp;

for ( ; it.hasNext(); )

{

temp = it.next();

if (temp.getFNum() == tp) //確認(rèn)航班號(hào)確實(shí)存在

{

for ( Iterator it2= temp.getBooked().iterator(); it2.hasNext(); )

{

Customer now = it2.next();

if (now.getName() == tp1 && now.getfNum() == tp) //確認(rèn)該顧客確實(shí)定了該航班的機(jī)票

{

temp.addFree(tem);

System.out.println("退票成功");

if (now.getSum() == tem) //如果顧客將自己買的票全部退票,則從買票列表刪除該顧客

temp.getBooked().remove(now);

}

}

for ( Iterator it2= temp.getWaiting().iterator(); it2.hasNext(); ) //遍歷該航班的waiting列表,看是否有滿足條件的購票請(qǐng)求可以滿足

{

Customer now = it2.next();

if (now.getSum() <= temp.getFree())

}

}

}

System.out.println("輸入信息有誤");

}

public void menu() //顯示菜單

{

System.out.println("----------");

System.out.println("1.航線查詢");

System.out.println("2.辦理退票");

System.out.println("3.辦理退票");

System.out.println("4.退出系統(tǒng)");

System.out.println("----------");

Scanner in = new Scanner(System.in);

int order = in.nextInt(); //指令

switch(order)

{

case 1: query(); break;

case 2: book(); break;

case 3: cancel(); break;

case 4: System.exit(0); in.close();break;

default: System.out.println("輸入錯(cuò)誤,請(qǐng) 重新運(yùn)行訂票系統(tǒng)!");

}

menu();

}

}

public class test

{

public static void main(String args[] )

{

Menu m = new Menu();

m.menu();

}

}

//這份才是真正完整的,也是我提交的最終版本

import java.util.ArrayList;

import java.util.LinkedList;

import java.util.*;

class Customer

{

private String name;

private String fNum; // flight number,表示他所定的航線的航線號(hào)

private int sum; //買了多少票

Customer()

{

}

Customer(String n, String f, int s)

{

name = n;

fNum = f;

sum = s;

}

public String getName()

{

return name;

}

public int getSum()

{

return sum;

}

public String getfNum()

{

return fNum;

}

public void setSum(int s)

{

sum = s;

}

}

class Flight

{

private static int sum = 0; //航線計(jì)數(shù)

private int order; //航線排列號(hào)

private String destination;//終點(diǎn)站名

private String FNum; //航班號(hào)

private int limit; //乘客限額

private int free; //余票數(shù)量

private LinkedList booked; //已預(yù)定客戶列表

private LinkedList waiting; //等候替補(bǔ)客戶名單

Flight()

{

}

Flight(int o, String d, String F, int l)

{

order = o;

destination = d;

FNum = F;

limit = free = l;

booked = new LinkedList();

waiting = new LinkedList();

}

public String getDestination()

{

return destination;

}

public String getFNum()

{

return FNum;

}

public void showInfo() //show information

{

System.out.println("航線排列號(hào)為:" + order + " 終點(diǎn)站為:" + destination);

System.out.println("航班號(hào)為:" + FNum + " 成員定額為: " + limit + " 剩余票數(shù)為: " + free);

System.out.println();

System.out.println("已訂票客戶有:");

Iterator it = booked.iterator();

for (; it.hasNext(); )

{

System.out.println(it.next().getName() + " ");

}

System.out.println();

System.out.println("等候替補(bǔ)客戶有:");

for ( it = waiting.iterator(); it.hasNext(); )

{

System.out.println(it.next().getName() + " ");

}

System.out.println();

}

public void isbook(Customer c)

{

if (c.getSum() > free) //檢驗(yàn)是否有足夠余票可供該顧客訂票

{

System.out.println("抱歉,票數(shù)暫時(shí)不足!");

waiting.add(c);

return;

}

book(c); //先判斷可不可以訂票,確認(rèn)可以再訂票

}

public void book(Customer c) //這個(gè)函數(shù)可重用,在退票以后,遍歷 waiting 鏈表之前

{

for (Iterator it = booked.iterator(); it.hasNext(); ) //判斷該顧客之前是否有訂過該航班的票

{

Customer now = it.next();

if (now.getName().equals(c.getName()))

{

now.setSum(now.getSum() + c.getSum());

free -= c.getSum();

System.out.println("顧客" + c.getName() + "訂票成功");

System.out.println("一共成功訂票" + now.getSum() + "張,航班號(hào)為" + FNum );

return;

}

}

booked.add(c);

free -= c.getSum();

System.out.println("顧客" + c.getName() + "訂票成功");

System.out.println("一共成功訂票" + c.getSum() + "張,航班號(hào)為" + FNum );

}

public void cancel(Customer c)

{

Iterator it = booked.iterator();

boolean found = false;

for ( ; it.hasNext(); )

{

Customer now = it.next();

if (now.getName().equals(c.getName()))

{

found = true;

free += c.getSum();

System.out.println("退票成功");

if (now.getSum() == c.getSum())//如果顧客將自己買的票全部退票,則從買票列表刪除該顧客

{

booked.remove(now);

break;

}

}

}

if (!found) System.out.println("退票失敗,您沒有定該航班的機(jī)票!");

System.out.println();

it = waiting.iterator();

for ( ; it.hasNext(); )

{

Customer now = it.next();

if (now.getfNum().equals(FNum) && now.getSum() <= free)

book(now);

}

}

}

class Menu

{

private ArrayList flights;

Flight temp;

public void init()

{

flights = new ArrayList();

Flight f = new Flight(1, "北京","k2", 20);

addFlight(f);

f = new Flight(2, "北京","k3", 23);

addFlight(f);

f = new Flight(3, "成都","k4", 25);

addFlight(f);

}

public void addFlight(Flight flight) //加入一條航線

{

flights.add(flight);

}

public void query() //查詢

{

System.out.println("請(qǐng)輸入要查詢的目的地城市:");

Scanner in = new Scanner(System.in);

String d = in.next();

Flight temp;

Iterator it = flights.iterator();

boolean found = false;

for ( ; it.hasNext(); )

{

temp = it.next();

if (temp.getDestination().equals(d))

{

found = true;

temp.showInfo();

}

}

if (!found)System.out.println("沒有檢索到相關(guān)信息");

}

public void book() //訂票

{

Scanner in = new Scanner(System.in);

System.out.println("請(qǐng)輸入訂票人數(shù):");

int t = in.nextInt();

Flight temp; // 航班類臨時(shí)變量

String tp, tp1; //tp 為航班號(hào),tp1為姓名

int tem; // temporary

for (int i = 0; i < t; i++)

{

System.out.println("請(qǐng)輸入航班號(hào),您的姓名,以及您想要訂購的票數(shù)");

tp = in.next();

tp1 = in.next();

tem = in.nextInt();

Customer c = new Customer(tp1, tp, tem); //構(gòu)造函數(shù)參數(shù)依次為:姓名、 航線號(hào)、 所購票數(shù)

Iterator it = flights.iterator();

boolean found = false;

for ( ; it.hasNext(); )

{

temp = it.next();

if (temp.getFNum().equals(tp))

{

temp.isbook(c);

found = true;

break;

}

}

if (!found) System.out.println("輸入的航線不存在!");

System.out.println();

}

}

public void cancel() //退票

{

Scanner in = new Scanner(System.in);

System.out.println("請(qǐng)輸入退票人數(shù):");

int t = in.nextInt();

Flight temp; // 航班類臨時(shí)變量

String tp, tp1; //tp 為航班號(hào),tp1為姓名

int tem; // temporary

for (int i = 0; i < t; i++)

{

System.out.println("請(qǐng)輸入航班號(hào),您的姓名,以及您想要退票的票數(shù)");

tp = in.next();

tp1 = in.next();

tem = in.nextInt();

Customer c = new Customer(tp1, tp, tem); //構(gòu)造函數(shù)參數(shù)依次為:姓名、 航線號(hào)、 所購票數(shù)

Iterator it = flights.iterator();

boolean found = false;

for ( ; it.hasNext(); )

{

temp = it.next();

if (temp.getFNum().equals(tp)) //確認(rèn)航班號(hào)確實(shí)存在

{

temp.cancel(c);

found = true;

break;

}

}

if (!found) System.out.println("輸入信息有誤");

System.out.println();

}

}

public void menu() //顯示菜單

{

System.out.println("----------");

System.out.println("1.航線查詢");

System.out.println("2.辦理訂票");

System.out.println("3.辦理退票");

System.out.println("4.退出系統(tǒng)");

System.out.println("----------");

Scanner in = new Scanner(System.in);

int order = in.nextInt(); //指令

switch(order)

{

case 1: query(); break;

case 2: book(); break;

case 3: cancel(); break;

case 4: System.exit(0); in.close();break;

default: System.out.println("輸入錯(cuò)誤,請(qǐng)重新運(yùn)行訂票系統(tǒng)!");

}

menu();

}

}

public class test

{

public static void main(String args[] )

{

Menu m = new Menu();

m.init();

m.menu();

}

}

-------------------------------這些是實(shí)驗(yàn)心得體會(huì)------------------------------

五、心得體會(huì)(要詳細(xì),編程中碰到的問題及解決方案)

搜過的資料(都是超鏈接,可直接點(diǎn)擊)

改進(jìn)和思考:

1.????????在寫 Menu類 的 book() 和 cancel() 函數(shù)時(shí),發(fā)現(xiàn)其實(shí)有大量重疊部分,因?yàn)?cancel() 函數(shù)在刪除完以后,也是要遍歷該航線的 Waiting列列表,看有沒有 Customer 對(duì)象能夠完成之前沒能完成的訂票。也就是說,book()函數(shù)里已經(jīng)實(shí)現(xiàn)過的功能,還需要在 cancel()函數(shù)里在實(shí)現(xiàn)一次。

這樣導(dǎo)致的結(jié)果,就是代碼看上去又拖沓又冗長,于是想了個(gè)辦法,在航班類里加入 book() 和 cancel() 函數(shù),并且將 Customer類對(duì)象作為參數(shù)傳到航班類里,這樣就能直接調(diào)用 Flight 類的函數(shù)來完成訂票退票,可以提高代碼的復(fù)用性。

而且,如果傳入 Customer類對(duì)象,那么,其實(shí)航班類的很多get函數(shù)都可以直接去掉了,一下子使代碼簡潔多了,看起來終于舒服多了,之前的一堆get函數(shù)很是拖沓…

從這個(gè)優(yōu)化的過程感受到的就是:

不要急著敲代碼,而是先想想能不能有更好的思路,比如這題,剛開始時(shí)就沒有想到特別透徹清楚明白的程度,導(dǎo)致后來,實(shí)現(xiàn)函數(shù)的時(shí)候才發(fā)現(xiàn),完全不用那么繁瑣,明明有更簡單的方法來實(shí)現(xiàn),我為什么要弄得那么復(fù)雜?

所以,先別急著敲代碼,而是應(yīng)該先把每一個(gè)細(xì)節(jié)琢磨清楚,多問問自己:還能不能再簡化一點(diǎn)?能不能再把代碼寫優(yōu)美一點(diǎn)?一拿到題目就做,往往是最浪費(fèi)時(shí)間的方法,因?yàn)楹竺嬗脕硇薷暮蛢?yōu)化的時(shí)間會(huì)更多。我應(yīng)該做的是,每次把所有優(yōu)化的可能考慮周全,盡量把類里的方法減少到最少,同時(shí)提高這些方法的利用率,我覺得這才是實(shí)驗(yàn)里最為關(guān)鍵的部分。

2.??????著手于簡化、簡化再簡化

將不必要的get 和 set 函數(shù)都去掉,例如 Customer類,該題不考慮顧客改名的情況,故而不需要? name 的 set方法;此外,該題沒有一個(gè)顧客同時(shí)買多個(gè)航線的飛機(jī)票的情況,就算真的要處理這種情況,按照我的代碼設(shè)計(jì)的邏輯,也是要新建一個(gè) Customer 對(duì)象的,因?yàn)槲矣X得這樣做更方便處理。

再說詳細(xì)一些就是,如果aaa同時(shí)買了 K2 和 K3 航班的票,那么,我打算采取的,不是將這這個(gè)航班的購票數(shù)都存在一個(gè) Customer的對(duì)象里,而是打算再建立一個(gè) Customer對(duì)象,保存 K3 的航班線名臣和K3的訂票數(shù)。因?yàn)樵谵k理訂票和退票時(shí),我們都是根據(jù)航班號(hào)來查航線的。如果把不同的航班號(hào),存在同一個(gè) Customer對(duì)象里,其實(shí)無形中加大了查找特定某航線的難度。

所以,照著這么說,航線名也是不會(huì)改的,如果這個(gè)顧客買的某個(gè)航線的票,全都被他自己后來退光了,那也只需要在那個(gè)航線的 booked 鏈表里刪掉這個(gè)顧客的信息即可

這么想來,其實(shí) fNum 的 set 方法也可以去掉,因?yàn)榫捅绢}的考慮,根本用不到這個(gè)方法。

唯一需要保留的 set 方法,是sum的set方法,因?yàn)榭赡艽嬖谕似钡珱]有退完的情況,這時(shí)就需要改變 Customer對(duì)象的訂票數(shù)了。

同理,對(duì)于 Flight 類,也應(yīng)進(jìn)行一次這樣的考慮和排查。因?yàn)榉椒ㄊ菫榱私鉀Q問題而設(shè)計(jì)的,不是為了寫一個(gè)方法而去寫一個(gè)方法。所以,如果能更簡單地解決問題,就不要把問題弄復(fù)雜了!~

3.????????情況考慮要比題目設(shè)置更加周全一些:

題目好像沒提到一點(diǎn),其實(shí)在進(jìn)行訂票時(shí),也應(yīng)該進(jìn)行一輪該航班的 booked 列表的遍歷。

因?yàn)?#xff0c;考慮真實(shí)情況時(shí),同一個(gè)顧客是可以多次訂票的,所以,我們需要先知道顧客之前有沒有訂過票,訂過和沒訂過的處理方式是不同的。

4.??????語法點(diǎn)和知識(shí)不太熟練,導(dǎo)致的失誤

4.1. 在進(jìn)行字符串比較時(shí),又忘了兩個(gè)字符串之間是不能直接用 == 來判斷相等的,而是應(yīng)該用 equals 函數(shù),又一次把 C++的語法規(guī)則套在Java上用了…說明我學(xué)的還是不到位啊!

4.2. 此外,用于讀取 String對(duì)象的 next 和 nextLine,必須弄清楚兩者的區(qū)別,正確選擇用哪個(gè),否則用了 equals 來比較以后,得到的結(jié)果仍然是不相等

4.3. 使用泛型前,要先對(duì)其進(jìn)行初始化,否則會(huì)出現(xiàn)空指針錯(cuò)誤

-------------------------------其他相關(guān)文章------------------------------

[ Java學(xué)習(xí) ] 類的其他文章匯總(都是超鏈接,可直接點(diǎn)擊):

總結(jié)

以上是生活随笔為你收集整理的java关于泛型的实验代码_[ Java学习 ] 泛型类的应用实验的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。