名白

  做一个输入名字就出现文档名字所对应的名字十年排名折线图

  YouNameItRecord implements YouNameItRecordInterface       //使用到了接口

 

 private String name;
private ArrayList<Integer> savedata;

public void parseRecord(String dataLine) {
//Vivian 127 78 73 112 129 148 221 380 491 330 277
//现将名字存起来,再将后面整数存进数组
//让其他函数获取
String[] words=dataLine.split(" ");
this.name=words[0];

this.savedata=new ArrayList<>();
String[] subWords=Arrays.copyOfRange(words,1,words.length);
// 遍历数组,把字符串转换成整数类型 rank 每一个数字
for (int i = 0; i < subWords.length; i++) {
savedata.add(Integer.parseInt(subWords[i]));
}
}

/**
* 返回当前记录的名字
* @return 名字
*/
public String getName(){
return name;
}

/**
* 返回当前记录的名字在某个十年里的排名
* @param decadesAfter1900 第几个十年,0代表1900-19091代表1910-1919,以此类推
* @return 该名字在对应十年期间的排名
*/
public int getRanking(int decadesAfter1900){
return savedata.get(decadesAfter1900);
}


public String toString(){
String[] arr=new String[savedata.size()];
for (int i = 0; i < savedata.size(); i++) {
arr[i]=String.valueOf(savedata.get(i));
}

String s = String.join(", ", arr);

return String.format("%s [%s]",name,s);
}

}
让其输入名字便可自动提前出表中后面的十年排名

使用到了很多的新知识,Java8才有的foreach+lambda 还有Steaam<>流
public YouNameItDatabase(String tilepath) {
this.tilepath = tilepath;
database = new HashMap<>();
// 将文件路径保存到Stream字符串流的 data
Stream<String> data = readFromFile();
// 调用方法 判断data是否为空,空则返回空指针异常,非空则返回对象
addAllRecord(Objects.requireNonNull(data));

}

// String类型的data进行forEach循环(名字S
private void addAllRecord(Stream<String> data)
{ // S -> 接收后面返回的参数 相当于for循环的int i=0
// data相当与for循环的boolean条件
data.forEach(s->{
YouNameItRecord record=new YouNameItRecord();
//调用record对象的方法,输入参数s进行循环
record.parseRecord(s);
//将名字,和整个类放存进数组
database.put(record.getName(),record);
});
}
// 查询
public YouNameItRecord findRecord(String name)
{
return database.get(name);
}

// 读取文件
public Stream<String> readFromFile(){
try {
return Files.lines(Path.of(tilepath));
}catch (IOException e){
e.printStackTrace();
}
return null;
}
}
设置一下画面运

// 给窗口设置标题
setTitle("名白");


nameLabel = new JLabel("姓名");
add(nameLabel, NORTH);

nameTextField = new JTextField(TEXT_FIELD_WIDTH);
// 设置文本输入为true
nameTextField.setEditable(true);
// 执行指令
nameTextField.setActionCommand("name-text-field");
// 添加操作监听器
nameTextField.addActionListener(this);
add(nameTextField, NORTH);

queryButton = new JButton("查询");
queryButton.setActionCommand("name-text-field");
queryButton.addActionListener(this);
add(queryButton, NORTH);

// 把按键贴到屏幕上
clearButton = new JButton("清空");
add(clearButton, NORTH);

//设置一个字符串来判断你究竟选择的是哪一个组件
clearButton.setActionCommand("clean");
clearButton.addActionListener(this);

// 画板
GCanvas canvas=getGCanvas();
double canvasWidth=getCanvasWidth();
double canvasHeight=getCanvasHeight();
GLine topLine=new GLine(15,10,15,canvasHeight-65);
GLine bottomLine=new GLine(15,canvasHeight-65,canvasWidth,canvasHeight-65);
canvas.add(topLine);
canvas.add(bottomLine);




for (int i = 1; i <= 11; i++) {
// 竖直的线
int width = (int) (canvasWidth/13)*i;
//划线
GLine verLine = new GLine(width,canvasHeight-75,width,canvasHeight-47);

// 年份
int num = 10;
int number = 1890+num*i;
//贴字
GLabel numb = new GLabel(String.valueOf(number));
numb.setLocation(width,canvasHeight-40);
canvas.add(verLine);
canvas.add(numb);
}
for (int i = 1; i < 13; i++) {
int height = (int) (canvasHeight/14)*i;
GLine line = new GLine(6,height,26,height);
int num = 100*i;
GLabel numb = new GLabel(String.valueOf(num));
int height2 = (int) (canvasHeight-50-50*i);
numb.setLocation(8,height2);
canvas.add(line);
canvas.add(numb);
}

setVisible(true);

// 显示查询名字的折线图
private void showAllResult()
{
resetUI();
if(names == null || names.size() == 0)
{
return;
}
else if(event.getActionCommand().equals("clear-console")) // 清空

int maxRank=getMaxRank(names);

showRankTicks(maxRank);

for(String name: names)
{
removeAll();
showOneResult(name,maxRank);
}
 
 
 

 

 
posted @ 2021-02-09 12:33  Ga7l  阅读(290)  评论(0)    收藏  举报