算法题python容器方法对应的Java容器方法

一、java基本数据类型

java中包含引用数据类型八种基本类型

  • 八种基本类型
基本类型 占用空间(bit) 说明 默认值 包装类
byte 8 有符号的,以二进制补码表示的整数,范围-128(-2 ^7)~ 127(2 ^7-1) 0 Byte
short 16 有符号短整型 0 Short
int 32 有符号整型 0 Integer
long 64 有符号长整型 0L Long
float 32 单精度浮点 0.0f Float
double 64 双精度浮点 0.0d Double
char 16 单一的 16 位 Unicode 字符 Character
boolean 8 布尔类型(true/false) false Boolean
  • 打印包装类的基本信息
System.out.println("基本类型:double 二进制位数:" + Double.SIZE);  
System.out.println("包装类:java.lang.Double");  
System.out.println("最小值:Double.MIN_VALUE=" + Double.MIN_VALUE);  
System.out.println("最大值:Double.MAX_VALUE=" + Double.MAX_VALUE); 
  • 基本数据类型都对应了其包装类,支持自动装箱和拆箱。
//自动装箱Integer x = Integer.valueOf(5)
Integer x = 5;
//拆箱,实际上执行了 int t = i.intValue();
int t = i; 
  • 数值类(byte,short,int,long,float,double)基本变量的包装类实现的方法
方法 含义
xxxValue() 将 Number 对象转换为xxx数据类型的值并返回。
compareTo() 将number对象与参数比较。
equals() 判断number对象是否与参数相等。
包装类.valueOf() 返回一个 Number 对象指定的内置数据类型
包装类.parseXXX() 静态方法,将字符串解析为XXX类。
toString() 以字符串形式返回值。

包装类转换为字符串类型:toString()
基本变量转换为字符串类型:+""
使用System.out.println(n);时会自动调用n对应类的toString方法

int n=Integer.parseInt("10");
System.out.println(n+"");
System.out.println(n);

Integer x = 5;
System.out.println(x.toString());
System.out.println(x);
  • 非数值类(char,boolean)基本变量的包装类实现的方法

1.Character 方法

方法 含义
Character.isLetter() 是否是一个字母
Character.isDigit() 数字字符
Character.isWhitespace() 是否是一个空白字符
Character.isUpperCase() 是否是大写字母
Character.isLowerCase() 是否是小写字母
toString() 返回字符的字符串形式,字符串的长度仅为1

2.Boolean方法:没啥可说的

二、java字符串类String

java中: ’ '表示字符;" "表示字符串
python中:二者没有区别
java中:有三种类型可以存储字符串:

  • java中几种常用的字符串构造方法:
String greeting = "菜鸟教程";

//字符数组
char[] helloArray = { 'r', 'u', 'n', 'o', 'o', 'b'};
String helloString = new String(helloArray);  
  • 连接字符串:
"Hello," + " runoob" + "!"

//concat方法
String s2 = ".....";
String s1 = "菜鸟教程";
s1.concat(s2);
  • 创建格式化字符串
System.out.printf("浮点型变量的值为 " +
                  "%f, 整型变量的值为 " +
                  " %d, 字符串变量的值为 " +
                  "is %s", floatVar, intVar, stringVar);
String fs;
fs = String.format("浮点型变量的值为 " +
                   "%f, 整型变量的值为 " +
                   " %d, 字符串变量的值为 " +
                   " %s", floatVar, intVar, stringVar);
  • String 方法
方法 说明
char charAt(int index) 返回第idx个字符
int compareTo(Object o) 把这个字符串和另一个对象比较
int compareTo(String anotherString) 按字典顺序比较两个字符串。
int compareToIgnoreCase(String str) 按字典顺序比较两个字符串,不考虑大小写。
boolean contentEquals(StringBuffer sb) 当且仅当字符串与指定的StringBuffer有相同顺序的字符时候返回真。
int indexOf(String str) 返回指定子字符串在此字符串中第一次出现处的索引。
int lastIndexOf(int ch) 返回指定字符在此字符串中最后一次出现处的索引。
int length() 返回此字符串的长度。
boolean matches(String regex) 告知此字符串是否匹配给定的正则表达式。
String replace(char oldChar, char newChar) 返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 得到的。
String replaceAll(String regex, String replacement) 使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串。
String[] split(String regex) 根据给定正则表达式的匹配拆分此字符串。
String substring(int beginIndex) 返回一个新的字符串,它是此字符串的一个子字符串。
String substring(int beginIndex, int endIndex) 它是此字符串的一个子字符串。
String trim() 返回字符串的副本,忽略前导空白和尾部空白。
String toUpperCase() 使用默认语言环境的规则将此 String 中的所有字符都转换为大写。

分割操作

 String s="1,2,3,4,8,9";
 String[] ssp=s.split(",");
 for (int i=0;i<ssp.length;i++){
            System.out.print(ssp[i]);
        }

切片操作

String s1="abcdefghij";
System.out.println(s1.substring(0,5));

三、Java StringBuffer 和 StringBuilder 类

StringBuffer和StringBuilder 更适合于可变的字符存储

StringBuffer sBuffer = new StringBuffer("菜鸟教程官网:");
sBuffer.append("www");
sBuffer.append(".runoob");
sBuffer.append(".com");
System.out.println(sBuffer);  
  • StringBuffer 方法:由于可变所以支持逆序,追加,插入,删除等操作;注意使用后用toString()方法转换为字符串
方法 说明
StringBuffer append(String s) 字符串追加到此字符序列
StringBuffer reverse() 将此字符序列用其反转形式取代。
delete(int start, int end) 移除此序列的子字符串中的字符。
insert(int offset, int i) 将 int 参数的字符串表示形式插入此序列中。
replace(int start, int end, String str) 使用给定 String 中的字符替换此序列的子字符串中的字符。
String substring(int start, int end) 返回一个新的 String,它包含此序列当前所包含的字符子序列。
String toString() 返回此序列中数据的字符串表示形式。

其余与String方法类似

        StringBuffer sb=new StringBuffer();
        sb.append('a');
        sb.append('b');
        sb.append('c');

        System.out.println(sb);
        System.out.println(sb.reverse());

四、IO、Stream、Sancer实现键盘输入

主要讲解从控制台输入,把输入的字符串解析为基本类型或者容器

1.使用BufferedReader

BufferedReader br = new BufferedReader(new InputStreamReader(System.in))

  • 注意抛异常
  • 可以read()读取一个字符,br.readLine()读取一行
public class BRRead {
    public static void main(String args[]) throws IOException {
    	char c;
        // 使用 System.in 创建 BufferedReader
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        c = (char) br.read();
public class BRRead {
    public static void main(String args[]) throws IOException {
    	String str;;
        // 使用 System.in 创建 BufferedReader
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        str = br.readLine();

2.使用Scaner类

  • 使用next() 与 nextLine() 方法获取输入的字符串
  • 使用 hasNext 与 hasNextLine 判断是否还有输入的数据

next() :

  1. 一定要读取到有效字符后才可以结束输入。
  2. 对输入有效字符之前遇到的空白,next() 方法会自动将其去掉。
  3. 只有输入有效字符后才将其后面输入的空白作为分隔符或者结束符。
  4. next() 不能得到带有空格的字符串。

nextLine() :

  1. 以Enter为结束符,也就是说 nextLine()方法返回的是输入回车之前的所有字符。
  2. 可以获得空白。
public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        // 从键盘接收数据
        // 判断是否还有输入
        if (scan.hasNext()) {
            String str1 = scan.next();
            System.out.println("输入的数据为:" + str1);
        }
        scan.close();
    }

3.结合Stream和map实现输入整体入容器

将Scaner获取的String切分后转换为Stream,采用map转换为数值之后存入容器

python:

lst=list(map(int,input().split(" ")))

java:

Scanner sc=new Scanner(System.in);
String[] ss=sc.nextLine().split(" ");
List<Integer> r3 = Stream.of(ss).map(x->Integer.parseInt(x)).collect(Collectors.toList());

//
List<Integer> r3 = Stream.of(ss).map(Integer::parseInt).collect(Collectors.toList());
System.out.println(r3);

五、数组与工具类Arrays

1.数组定义及初始化

  1. 定义
int[] a;
int[][] aa; 
  1. 初始化

静态:直接分配初始

a=new int[]{1,2,3};
aa=new int[][]{{1,2,3},{1,2,3}};

动态:直接分配空间,系统默认分配初值

a=new int[5];
aa=new int[5][];aa1=new int[5][5];
  1. 定义时初始化
静态
int[] a = new int[]{1,5};
int[][] aa = new int[][]{{1,5},{1,1},{2,4},{8,5}};
简化版本
int[][] aa ={{1,5},{1,1},{2,4},{8,5}};


动态:
int[] a=new int[4];

2.数组使用:

  1. 遍历

for循环

for(int i=0;i<arr.length,i++){
	System.our.println(arr[i]);
}

for each,把数组中的值先传递给形参

for(int i:arr){
	System.our.println(i);
}

3.数组工具类Arrays:

方法 含义
fill() 数组赋值
sort() 排序
copyOf() 拷贝
binarySearch() 二分查找
asList() 转换为List
toString() 打印数组元素
填充数组:Arrays.fill(array, 5)5 5 5 5 5 
将数组的第2和第3个元素赋值为8:Arrays.fill(array, 2, 4, 8)5 5 8 8 5 
对数组的第2个到第5个元素进行排序进行排序:Arrays.sort(intTest,2,6)15 78 5 22 29 32 17 34 
对整个数组进行排序:Arrays.sort(intTest)5 15 17 22 29 32 34 78 
比较数组元素是否相等:Arrays.equals(array, intTest):
false
克隆后数组元素是否相等:Arrays.equals(array, array1):
true
数组前两个元素位置颠倒结果是否相等:Arrays.equals(intTesta, intTestb):
false
元素12在testA中的位置:Arrays.binarySearch(testA, 12)2
元素9在testA中的位置:Arrays.binarySearch(testA, 9)-3
元素12在testA中03的位置:Arrays.binarySearch(testA, 0,3,12)2
元素12在testA中02的位置:Arrays.binarySearch(testA, 0,2,12)-3
[5, 5, 8, 8, 5]
copyOf方法截取的数组元素为:
5 5 8 8 
copyOfRange方法截取的数组元素为:
5 8 8 
toString方法打印数组元素:
[hello, how, are, you, !]
数组转换为list,打印结果为:
hello how are you ! 

六、容器/集合类

在这里插入图片描述
java的容器类定义的时候要具体指明模板参数,不如python的灵活

1.Collection接口方法(集合都有)

功能
向后追加 add(x)
向后追加所有 addAll(Collection<? extends E> c)
删除所有 clear()
包含 contains(Object o)
返回迭代器 iterator()
移除指定元素 remove(Object o)
大小 size()
stream()
转换为数组 toArray() / toArray(T[] a)
判空 isEmpty()

2.List

功能 python java
向后追加 append(x) add(x)
插入 insert(idx,x) add(idx,x)
移除下标idx元素,并返回 pop(idx) 默认idx=-1最后一个 remove(idx)默认idx=0
移除指定元素 remove(x)默认移除左边第一个 remove(Object):如(Integer.valueOf(x));
取值 lst[idx] get(idx)
赋值 lst[idx]=val set(idx,val)

3 Queue(接口)

功能 python java
入队 append(x) add(x)
出队 pop(0) poll()
队首元素 queue[0] peek()

3.1 Deque(接口)–》ArrayDeque

功能 java
队尾入队 add()/addLast()
队头入队 addFirst()
获取队头元素 peekFirst()
获取队尾元素 peekLast()
队头元素出队 pollFirst()
队尾元素出队 pollLast()

4. Set

java包含(HashSet,LinkedHashSet,TreeSet)

功能 python java
初始化 s=set() Set<> s=new Hashset<>();
添加 add() add()
s1交s2 s1 | s2 result.clear();
result.addAll(set1);
result.retainAll(set2);
s1并s2 s1 & s2 result.clear();
result.addAll(set1);
result.removeAll(set2);
s1差s2 s1-s2 result.clear();
result.addAll(set1);
result.addAll(set2);
取出 转化为列表
list(s)
使用迭代器
Iterator it = set.iterator();
while(it.hasNext()){
System.out.print(it.next() + " ");}

5. Map(java) /dict字典(python)

功能 python java
初始化 dic={} Map<> map=new HashMap<>();
根据key获取值 dic[key] map.get(key)
添加key-value dic[key] =value map.put(key,value)
包含key key in dic或者
key in dic.keys()
map.containsKey(key)
包含value v in dic.values() map.containsValue(V)
获取条目 dic.items() map.entrySet()

6.集合工具类collections

作用 静态方法
添加 addAll(Collection
二分查找 binarySearch(List
拷贝 copy()
填充 fill(List<? super T> list, T obj)
从枚举返回列表 list(Enumeration e)
大小 max(Collection),min,
逆序 reverse()
排序 sort()
交换 swap(List<?> list, int i, int j)

7.数组工具类Arrays

作用 静态方法
转换为list asList(T… a)
二分查找 binarySearch(int[] a, int key)
拷贝 copyOf(int[] original, int newLength)
排序 sort(float[] a)
转换为字符 toString(int[] a)
使用数组初始化List
ArrayList<Type> obj = new ArrayList<Type>(Arrays.asList(Object o1, Object o2, ..so on));
List<Integer> list=new ArrayList<>(Arrays.asList(1,2,3,4));

List转数组

int[] arr1 = list1.stream().mapToInt(Integer::valueOf).toArray();

7.集合排序

此处只针对集合元素为字符串和数值类型的集合
Java中对于数值类型和String实现了Comparable接口,重写了compareTo方法,因此可以比较。
连接:https://blog.csdn.net/qq_43437465/article/details/89437637

java对于简单排序都是ok的

List<Integer> list0 = new ArrayList<>();
Random random = new Random();
for(int i = 0; i<10;i++){
    list0.add(random.nextInt(100));

   //[2, 19, 44, 46, 61, 67, 68, 89, 91, 94]
}
System.out.println(list0);

Collections.sort(list0);
System.out.println(list0);

而对于python自带的多级排序输入为二维数组,java实现起来就比较麻烦了:

python多级排序

d1 = [{'name':'alice', 'score':38}, {'name':'bob', 'score':18}, {'name':'darl', 'score':28}, {'name':'christ', 'score':28}]
l = sorted(d1, key=lambda x:(-x['score'], x['name']))
print(l)
//输出
//[{'name': 'alice', 'score': 38}, {'name': 'christ', 'score': 28}, {'name': 'darl', 'score': 28}, {'name': 'bob', 'score': 18}]

参见java多级排序:

  • 对二维数组实现两级排序:
public class main {
    public static void main(String[] args){
        int [][]a = new int[][]{{1,5},{1,1},{2,4},{8,5}};
        Arrays.sort(a, new Comparator<int[]>() {
            @Override
            public int compare(int[] o1, int[] o2) {
                if (o1[0]==o2[0]) return o1[1]-o2[1];
                return o1[0]-o2[0];
            }
        });
        for (int[] a1: a) {System.out.println(a1[0]+" "+a1[1]);
        }
    }
}
  • 对自定义类实现多级排序
    http://blog.sina.com.cn/s/blog_5a15b7d10102w46p.html
    将员工按照级别工资工龄多级排序
public Class Employee {  
   
    public int level;  //级别  
    public int salary; //工资  
    public int years;  //入职年数 
}  
package net.oschina.tester;  
   
import java.util.ArrayList;  
import java.util.Collections;  
import java.util.Comparator;  
import java.util.List;  
   
  
public class Employee {  
   
    public static void main(String[] args) {  
        List objs = new ArrayList(){{  
            add(new Employee(5,3,5000,2));  
            add(new Employee(1,9,10000,10));  
            add(new Employee(4,5,8000,6));  
            add(new Employee(2,9,12000,7));  
            add(new Employee(6,1,2000,1));  
            add(new Employee(3,5,8000,12));  
        }};  
        Collections.sort(objs, comparator);  
        System.out.println("No\tLevel\tSalary\tYears\n=============================");  
        for(Employee a : objs)  
            System.out.printf("%d\t%d\t%d\t%d\n",a.id,a.level,a.salary,a.year);  
    }  
   
    public Employee(int id, int level, int salary, int year){  
        this.id = id;  
        this.level = level;  
        this.salary = salary;  
        this.year = year;  
    }  
       
    public int id;  
    public int level;  
    public int salary;  
    public int year;  
   
    private final static Comparator comparator = new Comparator(){  
        @Override  
        public int compare(Employee a1, Employee a2) {  
            int cr = 0;  
            int a = a2.level - a1.level;  
            if(a != 0)  
                cr = (a>0)?3:-1;  
            else{  
                a = a2.salary - a1.salary;  
                if(a != 0)  
                    cr = (a>0)?2:-2;  
                else{  
                    a = (int)(a2.year - a1.year);  
                    if(a != 0)  
                        cr = (a>0)?1:-3;  
                }  
            }  
            return cr;  
        }         
    };  
       
}  

七、java8新特性 ——Stream

对于python来说,既没有8大基本类型及其包装类的转换,还能支持函数式编程、lambda编程,可以说是非常方便,如sort,max,sum等函数,以及fliter等

java8通过stream也支持了这些操作
参考
https://www.cnblogs.com/chenpi/p/5915364.html
在这里插入图片描述

  • Java中List, Integer[], int[]的相互转换
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
 
public class Main {
    public static void main(String[] args) {
        int[] data = {4, 5, 3, 6, 2, 5, 1};
 
        "int[] 转 List<Integer>"
        List<Integer> list1 = Arrays.stream(data).boxed().collect(Collectors.toList());
        // Arrays.stream(arr) 可以替换成IntStream.of(arr)。
        // 1.使用Arrays.stream将int[]转换成IntStream。
        // 2.使用IntStream中的boxed()装箱。将IntStream转换成Stream<Integer>。
        // 3.使用Stream的collect(),将Stream<T>转换成List<T>,因此正是List<Integer>。
 
       "int[] 转 Integer[]"
        Integer[] integers1 = Arrays.stream(data).boxed().toArray(Integer[]::new);
        // 前两步同上,此时是Stream<Integer>。
        // 然后使用Stream的toArray,传入IntFunction<A[]> generator。
        // 这样就可以返回Integer数组。
        // 不然默认是Object[]。
 
        "List<Integer> 转 Integer[]"
        Integer[] integers2 = list1.toArray(new Integer[0]);
        //  调用toArray。传入参数T[] a。这种用法是目前推荐的。
        // List<String>转String[]也同理。
 
        "List<Integer> 转 int[]"
        int[] arr1 = list1.stream().mapToInt(Integer::valueOf).toArray();
        // 想要转换成int[]类型,就得先转成IntStream。
        // 这里就通过mapToInt()把Stream<Integer>调用Integer::valueOf来转成IntStream
        // 而IntStream中默认toArray()转成int[]。
 
        "Integer[] 转 int[]"
        int[] arr2 = Arrays.stream(integers1).mapToInt(Integer::valueOf).toArray();
        // 思路同上。先将Integer[]转成Stream<Integer>,再转成IntStream。
 
        "Integer[] 转 List<Integer>"
        List<Integer> list2 = Arrays.asList(integers1);
        // 最简单的方式。String[]转List<String>也同理。
 
        // 同理
        String[] strings1 = {"a", "b", "c"};
        // String[] 转 List<String>
        List<String> list3 = Arrays.asList(strings1);
        // List<String> 转 String[]
        String[] strings2 = list3.toArray(new String[0]);
 
    }
}

八、python math和java Math

从实现的功能来说,python要比java强大很多

功能 java python
三角函数
常量pi,e
数值舍取 round(),ceil(),floor() round()不在math包中
默认就有
最大最小绝对值 √(max和min两个参数)
sqrt()
对数 log():自然底数e
log10()
log2()
log(x,y=e)
log10()
最大公约数 - gcd(a,b)
n! - factorial(n)
范数 - hypot(x,y)

注意
java

  • gcd可以采用辗转相除法计算
def gcd(a,b):
    if a%b == 0:
        return b
    else :
        return gcd(b,a%b)
  • 任意底的对数,可以使用换底公式实现
    在这里插入图片描述

python

  • 阶乘factorial(n)要比自身实现快
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章