javase09_String&Collection

本文介绍了Java中的字符串处理技巧,包括排序、计数等,并详细讲解了StringBuffer、StringBuilder的用法。此外,还深入探讨了Java集合框架,如List、Set、Map的基本操作和特点。
----------------------------------------------------------------------------------------------String-----------------------------------------------------------------------------------------------------------
  • 字符数组排序:
    public class Test
    {
    	public static void main(String[] args)
    	{
    		String[] str1 = {"fdsaf","dsaf","awer"};
    		sort(str1);
    		for(String s : str1)
    			System.out.println(s);
    		
    	}
    	
    	public static void sort(String[] str)
    	{
    		for(int i = 0;i < str.length;i++)
    		{
    			for(int j  = i + 1; j < str.length ;j++)
    			{
    				if(str[i].compareTo(str[j]) > 0)
    				{
    					String temp = str[j];
    					str[j] = str[i];
    					str[i] = temp;
    				}
    			}
    		}
    	}
    	
    }

  • 字符串出现的次数:
    public int getKeyCount(String fromStr,String str)
    	{
    		int num = 0;
    		int index = fromStr.indexOf(str,0);
    		while(index != -1)
    		{
    			num ++;
    			index = fromStr.indexOf(str,index+str.length());
    		}
    		return num;
    	}

  • StringBuffer是个字符串的缓冲区,即就是它是一个容器,容器中可以装很多字符。并且能够对其中的字符进行各种操作。

    StringBuffer的特点:

    1是一个字符串缓冲区,其实就是一个容器。

    2长度是可变,任意类型都行。注意:是将任意数据都转成字符串进行存储。

    3容器对象提供很多对容器中数据的操作功能,比如:添加,删除,查找,修改。

    4所有的数据最终变成一个字符串。

  • 将int数组元素转换成字符串并打印:

    public class Test
    {
    	public static void main(String[] args)
    	{
    		StringBuffer sb = new StringBuffer();
    		int[] num = {1,2,3,4,5,6};
    		sb.append("[");
    		for(int i=0; i<num.length;i++)
    		{
    			if(i != num.length -1)
    				sb.append(num[i] + ",");
    			else
    				sb.append(num[i] + "]");
    		}
    		System.out.println(sb.toString());
    	}
    }

  • StringBuilder是线程不安全的,即就是在对容器操作的时候,不用去判断同步锁的问题,那么效率就高。并且API告诉我们优先采用StringBuilder类。


---------------------------------------------------------------------------------------------------------Collection------------------------------------------------------------------------------------------------------

  • 集合中存储的都是对象的引用(地址);

  • Collection定义了集合框架的共性功能。
    1,添加
        add(e);
        addAll(collection);

    2,删除
        remove(e);
        removeAll(collection);
        clear();

    3,判断。
        contains(e);
        isEmpty();

    4,获取
        iterator();
        size();

    5,获取交集。
        retainAll();

    6,集合变数组。
        toArray();



    1,add方法的参数类型是Object。以便于接收任意类型对象。

    2,集合中存储的都是对象的引用(地址)


    什么是迭代器呢?
    其实就是集合的取出元素的方式。
    如同抓娃娃游戏机中的夹子。

    迭代器是取出方式,会直接访问集合中的元素。
    所以将迭代器通过内部类的形式来进行描述。
    通过容器的iterator()方法获取该内部类的对象。

  • List元素是有序的,元素可以重复,因为该集合体系有索引。Set元素是无序的,元素不可以重复。

  • 枚举就是Vector特有的取出方式。
    发现枚举和迭代器很像。
    其实枚举和迭代是一样的。

    因为枚举的名称以及方法的名称都过长。
    所以被迭代器取代了。

  • LinkedList:特有方法:
    addFirst();
    addLast();

    getFirst();
    getLast();
    获取元素,但不删除元素。如果集合中没有元素,会出现NoSuchElementException

    removeFirst();
    removeLast();
    获取元素,但是元素被删除。如果集合中没有元素,会出现NoSuchElementException


    在JDK1.6出现了替代方法。

    offerFirst();
    offerLast();


    peekFirst();
    peekLast();
    获取元素,但不删除元素。如果集合中没有元素,会返回null。

    pollFirst();
    pollLast();
    获取元素,但是元素被删除。如果集合中没有元素,会返回null。

  • List中的contains方法是通过元素中的equals方法进行比较的

  • Set集合的功能是和Collection一样的。

  • HashSet是通过两个方法,hashCode和equals来保证元素唯一性的。首先判断hashCode,如果相同再判断equals.

  • TreeSet可以对集合中的元素进行排序,其底层数据结构是二叉树。保证元素唯一性的依据是compareTo方法返回0.

  • TreeSet排序的第一种方式:让元素自身具备比较性:元素需要实现Comparable接口,覆盖compareTo方法。这种方式也成为元素的默认排序。
    第二种方法:当元素自身不具备比较性时,或者具备的比较性不是所需要的时,需要让集合自身具有比较性,在集合初始化时,就有了比较方法。定义比较器,将比较器对象作为参数传递给TreeSet集合的构造函数。
    当两种排序都存在时,以比较器为主。
    比较器的定义,定义一个实现了Comparator接口的类。



    import java.util.*;
    
    public class Test
    {
    	public static void main(String[] args)
    	{
    		TreeSet al = new TreeSet((new MyComp()));
    		al.add(new Person("lisi01",13));
    		al.add(new Person("lisi02",11));
    		al.add(new Person("lisi03",11));
    		al.add(new Person("lisi01",12));
    		Iterator it = al.iterator();
    		while(it.hasNext())
    		{
    			Person p = (Person)it.next();
    			sop(p.getName() + "  " + p.getAge());
    		}
    	}
    	public static void sop(Object obj)
    	{
    		System.out.println(obj);
    	}
    	
    	public static ArrayList singleElement(ArrayList al)
    	{
    		ArrayList get = new ArrayList();
    		Iterator it = al.iterator();
    		while(it.hasNext())
    		{
    			Object obj = it.next();
    			if(!get.contains(obj))
    				get.add(obj);
    		}
    		return get;
    	}
    }
    
    class Person implements Comparable
    {
    	private String name;
    	private int age;
    	Person(String name,int age)
    	{
    		this.age = age;
    		this.name = name;
    	}
    	
    	public String getName()
    	{
    		return name;
    	}
    	
    	public int getAge()
    	{
    		return age;
    	}
    	
    	public boolean equals(Object obj)
    	{
    		if(!(obj instanceof Person))
    			return false;
    		Person p = (Person)obj;
    		return this.name.equals(p.name) && this.age ==p.age;
    	}
    	
    	public int hashCode()
    	{
    		return name.hashCode() + this.age * 23;
    	}
    	
    	//元素自身具有比较方法
    	public int compareTo(Object obj)
    	{
    		if(!(obj instanceof Person))
    			throw new RuntimeException("不是Person类");
    		Person p = (Person)obj;
    		if(this.age > p.age)
    			return 1;
    		if(this.age == p.age)
    		{
    			if(this.name.compareTo(p.name) > 0)
    				return 1;
    			if(this.name.compareTo(p.name) == 0)
    				return 0;
    		}
    		return -1;
    	}
    }
    
    //比较器
    class MyComp implements Comparator
    {
    	public int compare(Object o1,Object o2)
    	{
    		Person p1 = (Person)o1;
    		Person p2 = (Person)o2;
    		int num = p1.getName().compareTo(p2.getName());
    		
    		if(num == 0)
    		{
    			return new Integer(p1.getAge()).compareTo(new Integer(p2.getAge()));
    		}
    		return num;
    	}
    }


    ---------------------------------------------------------------------------------------------------------泛型---------------------------------------------------------------------------------------------------------


  •  泛型是JDK1.5之后出现的新特性,用于解决安全问题,是一个类型安全机制。
    好处:
    1:将运行时期出现的问题ClassCastException转移到了编译时期,让程序安全隐患减少。
    2.避免了强制转换麻烦。

  • 静态方法不可以访问类上定义的泛型。如果静态方法操作的应用数据类型不确定,可以将泛型定义在方法上。

    <pre name="code" class="java">
    public class Test
    {
    	public static void main(String[] args)
    	{
    		School<Student> s1 = new School<Student>();
    		s1.print1("sd");
    		s1.print2(new Student());
    		//s1.print2(new Teacher()); Error
    		School.print4(new Teacher());
    	}
    }
    
    class School <T>
    {	
    	public void print1(Object obj)
    	{
    		System.out.println(obj);
    	}
    	
    	public void print2(T t)
    	{
    		System.out.println(t);
    	}
    	
    	public <T> void print3(T t)
    	{
    		System.out.println(t);
    	}
    	
    	public static <T> void print4(T t)
    	{
    		System.out.println(t);
    	}
    }
    
    class Student
    {
    	
    }
    
    class Teacher
    {
    	
    }

    
    
  • ?通配符泛型的限定:? extends E:可以接收E类型或者E的子类型。上限。? super E :可以接收E类型或者E类型的父类型。下限。
  • Map集合:该集合存储键值对。一对一对往里存,而且要保证键的唯一性。
  • HashTable:顶层数据结构是哈希表,不可以存入null键null值该集合是线程同步的。效率低
  • HashMap:底层是哈希表数据结构,允许使用null键和null值,该集合是不同步的。效率高
  • TreeMap:底层是二叉树数据结构。线程不同步。可以用于给Map集合中的键进行排序。
  • Set底层就是使用Map集合。
  • Map中的put方法会返回一个值,如果存入的键值之前不存在,则返回null,反之返回之前该键值对应的值,并用新存入的值覆盖该值。keySet方法将Map中所有的值存入Set集合。因为Set方法具有迭代器,所以可以迭代方式取出所有的键,根据get方法。获取每个键对应的值。entrySet方法返回Map.Entry<k,v>
    //通过两种方法取出Map集合中的所有元素
    import java.util.*;
    public class Test 
    {
    
    	public static void main(String[] args) 
    	{
    		Map<String,String> map = new HashMap<String,String>();
    		map.put("01", "zhangsan1");
    		map.put("02", "zhangsan2");
    		map.put("03", "zhangsan3");
    		
    		//先获取集合中的所有键的Set集合,
    		Set<String> keySet = map.keySet();
    		Iterator<String> it1 = keySet.iterator();
    		while(it1.hasNext())
    		{
    			String key = it1.next();
    			System.out.println("key: " + key + "  value: " + map.get(key));
    		}
    		
    		System.out.println();
    		//将Map集合中的映射关系取出。存入到Set集合中
    		Set<Map.Entry<String, String>> entrySet = map.entrySet();
    		Iterator<Map.Entry<String, String>> it = entrySet.iterator();
    		while(it.hasNext())
    		{
    			Map.Entry<String, String> me = it.next();
    			System.out.println("key: " + me.getKey() + "  value: " + me.getValue());
    		}
    	}
    
    }
    

    Map.Entry 其实Entry也是一个接口,他是Map接口中的一个内部接口。
    interface Map
    {
    	public static interface Entry
    	{
    		public abstract Object getKey();
    		public abstract Object getValue();
    	}
    }
    能加static修饰符的接口都是内部接口


  • Collections,工具类,里面都是静态方法。常用方法sort,max,binarySearch,reverseOrder

  • Arrays,工具类,里面都是静态方法。asList可以将数组转换为List,方便用集合的思想和方法来操作数组中的元素。注意:将数组变为集合,不可以使用集合的增删方法。因为数组的长度是固定的。如果你增删,那么会发生UnsupportedOperationException.如果数组中的元素都是对象,那么变成集合时,数组中的元素就直接变成集合中的元素。如果数组中的元素都是基本数据类型,那么会将该数组变成集合中的元素存在。

  • Collection 接口中的toArray方法可以将集合转换为数组.当指定类型的数组长度小于了集合的size,那么该方法的内部会创建一个新的数组。数组的长度为集合的size,当指定类型的数组长度大于了集合的size,就不会新创建数组。所以创建一个刚刚好的数组最优。集合转换为数组是为了限定对元素的操作。


  • 使用for循环遍历集合元素时只能获取集合元素,但是不能对集合进行操作。迭代器除了遍历,还可以进行remove集合中元素的动作。如果是用ListIterator,还可以在遍历过程中对集合进行增删改查的动作。

  • 在使用可变参数的时候,要将可变参数放在参数列表的最后。


内容概要:本文设计了一种基于PLC的全自动洗衣机控制系统内容概要:本文设计了一种,采用三菱FX基于PLC的全自动洗衣机控制系统,采用3U-32MT型PLC作为三菱FX3U核心控制器,替代传统继-32MT电器控制方式,提升了型PLC作为系统的稳定性与自动化核心控制器,替代水平。系统具备传统继电器控制方式高/低水,实现洗衣机工作位选择、柔和过程的自动化控制/标准洗衣模式切换。系统具备高、暂停加衣、低水位选择、手动脱水及和柔和、标准两种蜂鸣提示等功能洗衣模式,支持,通过GX Works2软件编写梯形图程序,实现进洗衣过程中暂停添加水、洗涤、排水衣物,并增加了手动脱水功能和、脱水等工序蜂鸣器提示的自动循环控制功能,提升了使用的,并引入MCGS组便捷性与灵活性态软件实现人机交互界面监控。控制系统通过GX。硬件设计包括 Works2软件进行主电路、PLC接梯形图编程线与关键元,完成了启动、进水器件选型,软件、正反转洗涤部分完成I/O分配、排水、脱、逻辑流程规划水等工序的逻辑及各功能模块梯设计,并实现了大形图编程。循环与小循环的嵌; 适合人群:自动化套控制流程。此外、电气工程及相关,还利用MCGS组态软件构建专业本科学生,具备PL了人机交互C基础知识和梯界面,实现对洗衣机形图编程能力的运行状态的监控与操作。整体设计涵盖了初级工程技术人员。硬件选型、; 使用场景及目标:I/O分配、电路接线、程序逻辑设计及组①掌握PLC在态监控等多个方面家电自动化控制中的应用方法;②学习,体现了PLC在工业自动化控制中的高效全自动洗衣机控制系统的性与可靠性。;软硬件设计流程 适合人群:电气;③实践工程、自动化及相关MCGS组态软件与PLC的专业的本科生、初级通信与联调工程技术人员以及从事;④完成PLC控制系统开发毕业设计或工业的学习者;具备控制类项目开发参考一定PLC基础知识。; 阅读和梯形图建议:建议结合三菱编程能力的人员GX Works2仿真更为适宜。; 使用场景及目标:①应用于环境与MCGS组态平台进行程序高校毕业设计或调试与运行验证课程项目,帮助学生掌握PLC控制系统的设计,重点关注I/O分配逻辑、梯形图与实现方法;②为工业自动化领域互锁机制及循环控制结构的设计中类似家电控制系统的开发提供参考方案;③思路,深入理解PL通过实际案例理解C在实际工程项目PLC在电机中的应用全过程。控制、时间循环、互锁保护、手动干预等方面的应用逻辑。; 阅读建议:建议结合三菱GX Works2编程软件和MCGS组态软件同步实践,重点理解梯形图程序中各环节的时序逻辑与互锁机制,关注I/O分配与硬件接线的对应关系,并尝试在仿真环境中调试程序以加深对全自动洗衣机控制流程的理解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值