Array和set的练习及代码练习详情、TreeSet和HashSet使用代码

 List下有:ArrayList、LinkedList、Vector三种,下面描述的是ArrayList、LinkedList和Vector

List的ArrayList的实现:

了解ArrayList的各个方法的使用原理:

package cn.tedu.Arrays;

import java.util.Arrays;

/**
 * 练习:
实现ArrayList
	MyArray      (String)
	int size;//表示集合的元素个数
	String[] strArray;
 * @author cll
 */
class MyArray {
	private int size;
	private String[] strArray;
	//	1.定义无参的构造方法  默认给数组10个
	//	MyArray()
	public MyArray(){
		strArray = new String[10];
	}
	//2.定义一个带参的构造方法
	//MyArray(int length);
	public MyArray(int length){
		strArray=new String[length];
	}
	 /*3.add(String str);
		判断元素的个数和数组的长度之间的关系  size>=strArray 扩容
		添加元素
		size++; */
	public void add(String str){
		if(size>=strArray.length){
			grow();
		}
		strArray[size]=str;
		size++;
		
	}
	/*4.定义grow方法
	规则:数组长度的一半(如果数组长度为1 ,扩容应该是+1)*/
	public void grow(){
		if(strArray.length<=1){
			strArray = Arrays.copyOf(strArray, strArray.length+1);
			
		}else{
			strArray = Arrays.copyOf(strArray, strArray.length+strArray.length/2);
		}
	}
	/* 5.add(int index,String str)
		判断元素的个数和数组的长度之间的关系  size>=strArray 扩容
		当前的数组元素后移
		插入元素
		size++;*/
	public void add(int index,String str){
		if(size>strArray.length){
			grow();
		}
				//第一个参数:原数组
				//第二个参数:原数组元素的起始位置
				//第三个参数:目标数组
				//第四个参数:目标数组元素的起始位置
				//第五个参数:长度(拷贝元素的长度)
		System.arraycopy(strArray, index, strArray, index+1, size-index);
		strArray[index]=str;
		size++;
	}
	public void remove(int index){
		//6.remove(int index)
		//当前的数组元素前移
		//size--;
		System.arraycopy(strArray, index+1, strArray, index, size-index);
		size--;
	}
	//7.set(int index,String str):修改
	public void set(int index,String str){
		strArray[index] =str;
		
				
	}
	//8.get(int index):获取元素
	public String get(int index){
		return strArray[index];
	}
	//9.size():返回集合中的元素个数
	public int size(){
		return size;
	}
}
public class Demo{
		
	public static void main(String[] args) {
		MyArray arr =new MyArray();
		arr.add("hello");
		arr.add("abc");
		arr.add("admin");
		for(int i= 0;i<arr.size();i++){
			System.out.println(arr.get(i));
			
		}
	}

}

LinkedList的使用增添方法的练习:

package cn.tedu.Test;

import java.util.LinkedList;

public class DemoLinkedList {

	private int size = 0; // 节点个数
	private Node first; // 第一个节点
	private Node last; // 最后一个节点

	//无参构造方法
        public DemoLinkedList(){
        	//this();
        	LinkedList list=new LinkedList();
        }
        //添加元素
	public void add(String str) {
		Node node =new Node(null,str,null);
		if(size==0){
			this.first=node;
			this.last=node;
		}else{
			this.last.next=node;//新插入的node等于当前链表的最后一个的下一个
			node.prev=this.last;//新插入的node等于当前列表的最后一个
			this.last=node;//当前列表的最后一个变成node
		}
		size++;
	}
        //插入
	public void add(int index, String str) {
		//最后插入的调用add方法
		if(index==size){
			this.add(str);
			return;
		}
		Node node =new Node(null,str,null);
		if(index==0){
			//在链表的最前面
			node.next=this.first.prev;//node的下一个变成当前列表的第一个的前一个
			this.first.prev=node;//当前列表的第一个的前一个变成node
			
			this.first=node;
		}else{
			Node node1 =this.getNode(index);
			node1.prev.next=node;
			node.prev=node1.prev;
			node1.prev=node;
			node.next=node1;
			
		}
		

	}
        // 获取指定位置的节点
	private Node getNode(int index) {
		Node node = this.first;
		for(int i=0;i<index;i++){
			node=node.next;
		}
		return node;
		
		
	}
        //删除
	public void remove(int index) {
		if(index==0){//如果删除的是第一个
			this.first.next.prev=null;//把链表的第二个的前一个索引变为空
			this.first=this.first.next;//将这条链表的第一个位置上的值变成第二个的值
			
		}else if(index==size-1){//如果删除的是最后一个
			this.last.prev.next=null;
			this.last=this.last.prev;
		}else{
			Node node =this.getNode(index);
			node.prev.next=node.next;//node[index-1]下一个=node[index+1]
			node.next.prev=node.prev;//node[index+1]前一个=node[index-1]
		}
	}
        //返回节点的内容
	public String get(int index){
		return this.getNode(index).data;
		
	}
	// 返回元素个数
	public int size(){
		return size;
	      
	}
	//利用节点存储数据
	private class Node {

		Node prev; // 上一个节点
		String data; // 元素
		Node next; // 下一个节点

		public Node(Node prev, String data, Node next) {
			super();
			this.prev = prev;
			this.data = data;
			this.next = next;
		}

	}
}

Set集合的HashSet和TreeSet

HashSet如下所示:

package cn.tedu.Linkedlist;

import java.io.PrintStream;
import java.util.HashSet;
import java.util.Set;

public class Demo2 {
	public static void test(){
		Set<String> set = 
				new HashSet<>();
		set.add("张三");
		set.add("张三");
		set.add("李四");
		set.add("王五");
		set.remove("王五");
		set.forEach(System.out::println);
	}
	public static void test2(){
		Set<Emp> set= new HashSet<>();
		set.add(new Emp("张三"));
		set.add(new Emp("张三"));
		set.add(new Emp("李四"));
		set.add(new Emp("王五"));
		//在只有name方法之后,重写了hashCode之后才将张三看作是一个对象
		set.forEach(System.out::println);
		
	}
	public static void main(String[] args) {
		test2();
	}
}

TreeSet如下所示:

package cn.tedu.Linkedlist;

import java.util.TreeSet;

public class Demo3 {
	public static void test(){
		TreeSet<String> set =new TreeSet<>();
		set.add("abc");
		set.add("bde");
		set.add("ayui");
		set.forEach(System.out::println);
	}
	public static void test2(){
		TreeSet<Emp> set =new TreeSet<>(
				(emp1,emp2)->emp1.getName().length()-emp2.getName().length());
		set.add(new Emp("admin"));
		set.add(new Emp("abn"));
		set.add(new Emp("adjllkl"));
		set.forEach(System.out::println);
	}
	public static void main(String[] args) {
		test2();
	}
}

HashSet是基于HashMap实现,是map中的key

HashSet和HashMap的不同:

HashSet是对象为元素的,是实现的set接口,使用add添加元素的,对象的存储有相同的,需要重写HashCode和equals方法区分相同的元素。

HashMap是以一组对象作为元素的,是实现的Map接口,使用put添加元素。

map:不允许有重复的key

分为:TreeMap和HashMap两种,TreeMap是有排序的,HashMap是不排序的。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值