泛型和集合的简单使用
public class Easy {
public static void main(String[] args) {
Cat<String>cat=new Cat();
String m1=cat.<Integer>say(111);//泛型类中的泛型方法,
String m2=cat.getName();
//System.out.print(m1);
System.out.print(m2);
}
}
class Cat <T extends Comparable>
{
private T name;
private T age;
private T birth;
private T color;
public <T extends Comparable> String say(T name)//泛型方法。 区别//泛型方法或类的定义课限制一些东西
{
return "1234";
}
public T getName()//泛型类,区别于泛型方法
{
return this.name;
}
}
需要记住的蛮少,泛型一般以<>放在类定义的后面部分,泛型方法一般放在方法限制public,private等的后面,注意一点泛型方法和泛型类中的方法是不一样的,此外泛型类可以定义多个T,U,R等,另外在定义时,可以extends一些接口,这样只有实现了这个接口的类可以加入这些类里面。
基本的一些知识点,继承collection接口。基本的增删擦改的方法,记忆。
Arraylist和Linkedlist在插入和删除效率方法有所不同,注意Object[]toArray()方法的应用,返回集合的相应对象的数组,此外各种方法的应用也记忆清楚,另外最好集合+泛型配合使用,否则在遍历的时候出现类型不匹配,需要强制类型转换的问题。
Set集合的使用规则
public class HashSet {
public static void main(String[]args) {
/*
Set<Integer> set=new TreeSet();
for(int i=0;i<10;i++)
{
set.add(i);
}
set.add(50);//自动排序
set.add(30);
Iterator<Integer> it=set.iterator();
for(int i=0;i<12;i++)//遍历方法,注意加泛型。
{
int m=it.next();
System.out.print(m);
}
*/
/* 不按顺序,不按套路。
Set<Integer>sets=new java.util.HashSet<>();
for(int i=0;i<10;i++)
{
sets.add(i);
}
sets.add(50);
sets.add(30);
Iterator<Integer> it=sets.iterator();
while(it.hasNext())
{
int m=it.next();
System.out.print(m);
}
*/
}
}
Set集合除了基本操作的问题,其自动覆盖相同的值的特性在算法题的应用上,可以获得很巧妙的效果另外,此代码对于理解TreeSet和HashSet的区别有很大帮助,Debug出装填因子 0.75.和哈希表的双倍扩容也很关键。
Map关键对的简单使用
public class Map {
public static void main(String[] args) {
java.util.Map<String,Employ> staff=new HashMap();
Employ a=new Employ(21,"HXT");
staff.put("2010300617",a);
staff.put("2010300725",new Employ(20,"赵航"));
staff.put("2010300717",new Employ(20,"王思儒"));
System.out.print(staff.get("2010300617"));//Map的打印、
// staff.forEach((k,v)->System.out.print(k+v));Lambda表达式,循环遍历
Set keys=staff.keySet();
Iterator<String> it=keys.iterator();
while(it.hasNext())//第一种遍历方式
{
String s=it.next();
System.out.print(staff.get(s));
}
}
}
class Employ
{
private int age;
String name;
public Employ(int age, String name) {
this.age = age;
this.name = name;
}
@Override
public String toString() {
return "Employ{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
}
各种不同的遍历方法多理解几遍,另外其不是继承Collection接口。元素的添加方式为put,而且第一个key-是唯一的value不唯一性。
算法篇之时钟加时问题
题目背景:有时候人们用四位数字表示一个时间,比如 1106 表示 11 点零 6 分。现在,你的程序要根据起始时间和流逝的时间计算出终止时间。
读入两个数字,第一个数字以这样的四位数字表示当前时间,第二个数字表示分钟数,计算当前时间经过那么多分钟后是几点,结果也表示为四位数字。当小时为个位数时,没有前导的零,例如 5 点 30 分表示为 530;0 点 30 分表示为 030。注意,第二个数字表示的分钟数可能超过 60,也可能是负数。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
int startTime = 0,stopTime,elapsed = 0,minute;
Scanner scanner = new Scanner(System.in);
if(scanner.hasNext()) {//判断是否有输入
startTime = scanner.nextInt();
elapsed = scanner.nextInt();//流失时间
}
scanner.close();
minute = (startTime/100)*60+startTime%100;
stopTime = minute+elapsed;
stopTime = (stopTime/60)*100+stopTime%60;
if(startTime%100 == 0){
System.out.println("0"+stopTime);
}else{
System.out.println(stopTime);
}
}
}
注意思想的使用,先转换成能进行数学运算的数据,在转换成方便于输出的数据,称其为 双重转换法。
算法篇 Math的用法
题目背景:2018年FISM(世界魔术大会)近景总冠军简纶廷的表演中有一个情节:以桌面上一根带子为界,当他将纸牌从带子的一边推到另一边时,纸牌会变成硬币;把硬币推回另一边会变成纸牌。
这里我们假设纸牌会变成等量的硬币,而硬币变成纸牌时,纸牌的数量会加倍。那么给定纸牌的初始数量,当他来回推了 N 次(来/回各算一次)后,手里拿的是纸牌还是硬币?数量是多少?
输入格式:
输入在一行里给出两个正整数,分别是纸牌的初始数量和魔术师推送的次数。这里假设初始状态下魔术师手里全是纸牌。
输出格式:
如果最后魔术师手里是纸牌,输出 0 和纸牌数量;如果是硬币,则输出 1 和硬币数量。数字间须有 1 个空格。题目保证结果数值不超出整型范围(即 2
31
−1)。
import java.util.*;
public class Main
{
public static void main(String[]args)
{
Scanner myscanner=new Scanner(System.in);
int m1=myscanner.nextInt();
int m2=myscanner.nextInt();
int n=new Double(m1*(Math.pow(2,m2/2))).intValue();
if(m2%2==1)
System.out.print(1+" "+n);
else
System.out.print(0+" "+n);
}
}
基本思想简单,但是注意使用pow函数时,运算结果默认为double类型,需要new Double().intValue 转换为Int类型输出。
其他小知识点:** String sa=String.format(“%.1f”,a);//java中保存几位几位精度一般的转换方式**
字符变换问题
本题要求编写程序,将英文字母替换加密。为了防止信息被别人轻易窃取,需要把电码明文通过加密方式变换成为密文。变换规则是:将明文中的所有英文字母替换为字母表中的后一个字母,同时将小写字母转换为大写字母,大写字母转换为小写字母。例如,字母a->B、b->C、…、z->A、A->b、B->c、…、Z->a。输入一行字符,将其中的英文字母按照以上规则转换后输出,其他字符按原样输出。
输入格式:
输入一行字符,以回车符 '\n'作为 结束符。
输出格式:
将输入的一行字符中的所有英文字母替换为字母表中的后一个字母,同时将小写字母转换为大写字母,大写字母转换为小写字母后输出,其他字符按原样输出。
输入样例:
在这里给出一组输入。例如:
Reold Z123?
输出样例:
在这里给出相应的输出。例如:
sFPME a123?
import java.util.*;
public class Main
{
public static void main(String[]args)
{
Scanner myscanner=new Scanner(System.in);
String s=myscanner.nextLine();
char[]arr=s.toCharArray();
for(int i=0;i<arr.length;i++)
{
int n=(int)arr[i];
if(n>=65&&n<=89)
n=n+32+1;
else if(n==90)
n=n-25+32;
else if(n>=97&&n<=121)
n=n+1-32;
else if(n==122)
n=n-25-32;
System.out.print((char)n);
}
}
}
注意.nextLine();输入字符串的使用。此外处理字符串问题一般先转换为字符数组进行处理,要记住ASC码中 大小写字母的值。
小知识点: char a=myscanner.next().charAt(0);输入单个字符的方法。
就是这些,持续更新,我在精读中将常见的列举出来便于大家理解。