Java数组、排序、集合

本文详细介绍了Java中的数组,包括定义、赋值、获取长度及二维数组的使用。接着讲解了冒泡排序和选择排序的原理及实现。此外,还探讨了Java集合框架,包括List、Set接口及其实现类的特性,并提供了相关练习题。
摘要由CSDN通过智能技术生成

一、数组

数组是一个变量,存储相同数据类型的一组数据。

1.定义数组:

类型[]  数组名  =  new  类型[长度];

类型[]  数组名; 数组名 = new 类型[长度];

类型[]  数组名  =  new  类型[]{值1,值2,值3};

类型[]  数组名  =  {值1,值2,值3};

2.数组赋值

scores[0] = 89;
scores[1] = 79;
scores[2] = 76;
int[ ] scores = {89, 79, 76};
int[ ] scores = new int[ ]{89, 79, 76};
//键盘输入赋值
Scanner input = new Scanner(System.in);
for(int i = 0; i < 30; i ++){
     scores[i] = input.nextInt();
}

3.获取数组长度:

数组名.length

练习1:

有一个数列:8,4,2,1,23,344,12。题目要求:循环输出数列的值, 求数列中所有数值的和。猜数游戏:从键盘中任意输入一个数据,判断数列中是否包含此数。

方法一:

public class ShuZu {
    public static void main(String[] args) {
        int[] number = new int[]{8, 4, 2, 1, 23, 344, 12};
        int sum = 0;
        for (int i = 0; i < 7; i++) {
            System.out.println("number[" + i + "] = " + number[i]);
            sum += number[i];
        }
        System.out.println("和为:" + sum);

        Scanner number2 = new Scanner(System.in);
        System.out.println("请输入一个随机数:");
        int n = number2.nextInt();
        int m = 0;
        for (int i = 0; i < 7; i++) {
            if (n == number[i]) {
                System.out.println("该数组包含该随机数");
                break;
            }
            m++;
        }
        if(m == 7)
            System.out.println("该数组不包含该随机数");
    }
}

 方法二:

import javax.xml.transform.Source;
import java.util.Scanner;

public class DemoF {
    public static void main(String[] args) {
        int[] number = { 8,4,2,1,23,344,12};

        Scanner input = new Scanner(System.in);
        System.out.println("请输入一个数值:");
        int locNum =  input.nextInt();

        int sum = 0;
        boolean isOk = false;

        for (int i = 0; i < number.length; i++) {
            System.out.println(number[i]);

            sum += number[i];

            if(locNum == number[i]){
                isOk = true;
            }
        }
        System.out.println("和:"+sum);
        System.out.println(isOk?"包含:"+locNum:"不包含:"+locNum);

    }
}

4.二维数组

存值语法:

数组名[下标1][下标2] = 值;

二、冒泡排序和选择排序

1.冒泡排序

原理:

  1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。

  2. 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。

  3. 针对所有的元素重复以上的步骤,除了最后一个。

  4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

 算法实现:

int[] number = {8, 4, 2, 1, 23, 344, 12};
for (int i = 0; i < number.length - 1; i++) {
    for (int k = 0; k < number.length - 1 - i; k++) {
        if (number[k] > number[k + 1]) {
            int tmp = number[k];
            number[k] = number[k + 1];
            number[k + 1] = tmp;
        }
     }
}
System.out.println(Arrays.toString(number));

2.选择排序

原理:

        第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。

代码实现:

int[] number = {8, 4, 2, 1, 23, 344, 12};
int index;
for (int i = 0; i <   number.length - 1; i++) {
    index = i;
    for (int k = i; k < number.length; k++) {
        if(number[k] < number[index]){
            index = k;
        }
    }
    int tmp = number[i];
    number[i] = number[index];
    number[index] = tmp;
}
System.out.println(Arrays.toString(number));

练习2:

int[] numbers = {8,5,9,87,7,12,85,32,112,47,28,4,55,2,56,74}; 要求 将 29 按照顺序 插入到当前 数组中。实现思路(创建 大于当前numbers数组一位长度的新数组,将数据按照顺序导入到新的数组中,使用循环找出 29 应该所在的下标, 将 29 所在下标后的数据 全部后移一位, 将 29 插入新的数组。)

方法一:

import java.util.Arrays;

public class HuanShuZu {
    public static void main(String[] args) {
        int[] numbers = {8,5,9,87,7,12,85,32,112,47,28,4,55,2,56,74};
        System.out.println("原数组:"+ Arrays.toString(numbers));
        Arrays.sort(numbers);
        System.out.println("排序后:"+Arrays.toString(numbers));

        int[] newnumbers = Arrays.copyOf(numbers, numbers.length+1);
        System.out.println("复制后:"+Arrays.toString(newnumbers));

        int n = 0;
        int num = 29;
        for (int i = 0; i < newnumbers.length; i++) {
            if(num < newnumbers[i]){
                n=i;
                break;
            }
        }
        for (int i = newnumbers.length-1; i > n; i--) {
            newnumbers[i] = newnumbers[i-1];
        }
        newnumbers[n] = num;
        System.out.println("插入后:" + Arrays.toString(newnumbers));
    }
}

方法二:

import java.util.Arrays;

public class DemoB {
    public static void main(String[] args) {
        int[] numbers = {8,5,9,87,7,12,85,32,112,47,28,4,55,2,56,74};
        // 显示原数组
        System.out.println("原数组:"+Arrays.toString(numbers));
        Arrays.sort(numbers);//完成排序
        System.out.println("排序后数组:"+Arrays.toString(numbers));

//        int[] newNumbers = new int[numbers.length + 1];
//        for (int i = 0; i <numbers.length ; i++) {
//            newNumbers[i] = numbers[i];
//        }

        //Arrays.copyOf(原数组,长度)  复制数组元素到一个新的数组中
        int[] newNumbers = Arrays.copyOf(numbers,numbers.length + 1);
        //复制数组 长度 +1(为 29 元素 腾出位置)
        System.out.println("复制后的数组:"+Arrays.toString(newNumbers));

        //声明 变量 index 标记29的位置 预计29是最小的 下标为0
        int index = 0;
        int num = 29;// 需要插入到数组中的元素
        for (int i = 0; i < newNumbers.length ; i++) {
            if(num <newNumbers[i]){
                //记录 插入元素应该所在的下标
                index = i;
                break;
            }
        }
        //将num 元素所在下标的 所有后位元素 后移一位
        for (int i = newNumbers.length - 1; i > index ; i--) {
                newNumbers[i] = newNumbers[i-1];
        }
        //将元素放入新的数组
        newNumbers[index] = num;

        System.out.println("插入元素后的数组:"+Arrays.toString(newNumbers));

        // 倒序显示数组
        for (int i = newNumbers.length-1 ; i >=0 ; i--) {
            System.out.print(newNumbers[i]+",");

        }

    }
}

补:反转排序

import java.util.Arrays;

public class DemoC {
    public static void main(String[] args) {
        int[] numbers = {8,5,9,87,7,12,85,32,112,47,28,4,55,2,56,74};
        // 反转排序
        for (int i = 0; i < numbers.length / 2; i++) {
            int temp = numbers[i];
            numbers[i] =numbers[numbers.length-i-1];
            numbers[numbers.length-i-1] = temp;
        }
        System.out.println(Arrays.toString(numbers));

    }
}

三、集合

1.List接口

List 接口存储一组不唯一,有序(插入顺序)的对象

List下有

ArrayList:查询快;

Vector:查询快,安全;

LinkedList:增删快。

定义代码:

ArrayList<String> arrayList = new ArrayList<>();
Vector<String> vector= new Vector<>();
LinkedList<String> linkedList= new LinkedList<>();
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;

public class DemoA {
    public static void main(String[] args) {
        // 通过List接口 创建 ArrayList集合
        // 基本数据类型  byte short int long  float double boolean  char
        //List<泛型> 指定泛型后 只能放入符合泛型类型的数据进入集合中
        //未指定泛型 类型默认为 Object 可以存储任何类型

        List<String> list = new ArrayList<>();

        // 向集合中增加数据   使用了 ArrayList的 add(值) 返回结果为 boolean true 添加成功  false 添加失败

        boolean isOk = list.add("张三");
        System.out.println(isOk);
        list.add("李四");
        list.add("王五");
        // 新增数据到固定的下标
        list.add(1,"测试数据");

        System.out.println("获取集合长度:" + list.size());
        System.out.println("根据下标获取集合元素:"+list.get(2));
        // 通过contains(值) 检测集合中是否存在 对应值  存在 true  不存在 false
        System.out.println("检查集合中是否存在王五:" + list.contains("王五"));
        //list.remove(3);//通过下标删除 集合元素
        list.remove("王五"); //通过元素 删除集合中的元素
        System.out.println("检查集合是否为空:"+list.isEmpty());
//        list.clear(); //清空集合

        //遍历集合
        for (String str:list) {
            System.out.println(str);
        }

        
        List<String> newList =  list.subList(0,2);//取集合第0位到第2位
        for (String str:newList) {
            System.out.println(str);
        }

        //
        Object[] strs = list.toArray();
        System.out.println(Arrays.toString(strs));

        //
        Iterator<String> iterator = list.iterator();
        // iterator.hasNext() 返回boolean true 存在下一条数据
        while (iterator.hasNext()){
            String str = iterator.next();
            System.out.println(str);
        }

    }
}
import java.util.ArrayList;
import java.util.List;

public class DemoD {
    public static void main(String[] args) {
        List<String> listA = new ArrayList<>();
        listA.add("A");
        listA.add("B");
        listA.add("C");
        List<String> listB = new ArrayList<>();
        listB.add("B");
        listB.add("C");
        listB.add("D");

        //获取 lsitA  与  listB的交集数据
//        listA.retainAll(listB);

        //获取 listA 与 listB的差集
        listA.removeAll(listB);

        //将listA 与 listB 合并
        listA.addAll(listB);

        //显示集合listA
        System.out.println(listA);
    }
}

2.Set接口

Set 接口存储一组唯一,无序的对象

Set下有

HashSet:无序,唯一;

LinkedHashSet:插入有序,唯一;

TreeSet:有序,唯一。

 定义代码:

HashSet<String> hashSet = new HashSet<>();
LinkedHashSet<String> linkedHashSet = new LinkedHashSet<>();
TreeSet<String> treeSet = new TreeSet<>();

应用: 

import java.util.*;

public class DemoE {
    public static void main(String[] args) {
        //通过set接口创建 HashSet
        Set<String> set = new HashSet<>();

        // 向集合中增加数据   使用了 ArrayList的 add(值) 返回结果为 boolean true 添加成功  false 添加失败
        boolean isOk = set.add("张三");
        System.out.println(isOk);
        set.add("李四");
        set.add("王五");
        set.add("王五");
        set.add("王五");

        System.out.println("获取集合长度:" + set.size());
        // 通过contains(值) 检测集合中是否存在 对应值  存在 true  不存在 false
        System.out.println("检查集合中是否存在王五:" + set.contains("王五"));
//        set.remove("王五"); //通过元素 删除集合中的元素
        System.out.println("检查集合是否为空:"+set.isEmpty());
//        set.clear(); //清空集合
        for (String str:set) {
            System.out.println(str);
        }
        System.out.println("--------------------------------");
        Object[] strs = set.toArray();
        System.out.println(Arrays.toString(strs));
        System.out.println("--------------------------------");
        Iterator<String> iterator = set.iterator();
        // iterator.hasNext() 返回boolean true 存在下一条数据
        while (iterator.hasNext()){
            String str = iterator.next();
            System.out.println(str);
        }
    }
}

3.Map接口

Map接口存储一组键值对象,提供key到value的映射
import java.util.*;

public class DemoF {
    public static void main(String[] args) {
        // 通过 map接口 创建了HashMap
        Map<String, String> stringMap = new HashMap<>();
        // 将数据保存到map集合中
        stringMap.put("ES","西班牙 ");
        stringMap.put("NL","荷兰");
        stringMap.put("AF","阿富汗-测试");

        stringMap.put("AF","阿富汗");
        stringMap.put("AR","阿根廷");
        stringMap.put("AU","澳大利亚");

        //通过key 获取value
        System.out.println("通过get(key)获取value:"+stringMap.get("AF"));

        System.out.println("通过size()方法获取map 集合长度:"+stringMap.size());
        System.out.println("集合是否为空:"+stringMap.isEmpty());
        System.out.println("通过containsKey(key)判断key是否存在: "+stringMap.containsKey("AU"));
        System.out.println("通过 containsValue(value) 判断value是否存在: "+stringMap.containsValue("阿根廷"));
        stringMap.replace("AR","阿根廷-测试替换方法");
        System.out.println("通过get(key)获取value:"+stringMap.get("AR"));

        //通过key 删除 value
        stringMap.remove("AR");

        System.out.println("-------------------------------");
        // 通过keySet()方法 获取map集合的所有key
        Set<String> keys = stringMap.keySet();
        for (String key:keys) {
            System.out.println("key:"+key+",value:"+stringMap.get(key));
        }
        System.out.println("-------------------------------");
        Iterator<String> values = stringMap.values().iterator();
        while (values.hasNext()){
            System.out.println(values.next());
        }
        System.out.println("-------------------------------");
        Iterator<String> iteratorkeys =  stringMap.keySet().iterator();
        while (iteratorkeys.hasNext()){
            String key = iteratorkeys.next();
            System.out.println("key:"+key+",value:"+stringMap.get(key));
        }
    }
}

练习3:

 代码实现:

import java.util.*;

public class LianXi {
    public static void main(String[] args) {
        Random random = new Random();
        List<Integer> list = new ArrayList<>();
//        System.out.println(random.nextInt(100)+1);
        int[] number = new int[10];
        for (int i = 0; i < 10; i++) {
            number[i] = random.nextInt(100)+1;
            if(number[i] > 10){
                list.add(number[i]);
            }
        }
        Iterator<Integer> iterator = list.iterator();
        while (iterator.hasNext()){
            Integer str = iterator.next();
            System.out.println(str);
        }

    }
}
import java.util.*;

public class Lianxi2 {
    public static void main(String[] args) {
        Map<Integer, String> map = new HashMap<Integer, String>();
        map.put(1,"张三丰");
        map.put(2,"周芷若");
        map.put(3,"汪峰");
        map.put(4,"灭绝师太");

        Iterator<Integer> iteratorkeys =  map.keySet().iterator();
        while (iteratorkeys.hasNext()) {
            Integer key = iteratorkeys.next();
            System.out.println("key:" + key + ",value:" + map.get(key));
        }

        map.put(5,"郭靖");

        map.remove(1);

        map.replace(2,"周林");
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值