`
VIP庚
  • 浏览: 221123 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

简单认识动态数组

阅读更多
什么是数组?
数组是具有相同的数据类型且按一定次序排列的一组变量的集合体

一维数组:连续内存的,线性的,有下标的,长度固定的
动态数组: 连续内存的,线性的,有下标的 ,长度可变的

说到动态数组 那么不如自己定义一个


public class DynamicArray2<E> {

	int rongliang = 10;// 容量
	int bilv = 10;// 增长比率
    Object[] src = new Object[rongliang];

	public DynamicArray2(){
		
	}
	
	public DynamicArray2(int rongliang, int bilv) {
		this.rongliang = rongliang;
		this.bilv = bilv;
		Object[] src = new Object[rongliang];
	}

	// 三个新概念
	// 容量,增长比率,可变数组长度(元素个数)

	// 定义一个原始数组
	

	/**
	 * 查找数组中第一个为null的位置下标
	 * 
	 * @return
	 */
	private int getNullIndex() {
		for (int i = 0; i < src.length; i++) {
			if (src[i] == null) {
				return i;
			}
		}
		return -1;
	}

	/**
	 * 将指定元素放入数组
	 * 
	 * @param s
	 *            要放入的元素内容
	 */
	public void add(E s) {
		// 如果长度<容量,不需要新数组
		if (size() >= src.length) {
			// 定义一个新数组,长度是原始数组长度+1
			Object[] dest = new Object[src.length + bilv];
			// 将原始数组中的数据考入新数组
			for (int i = 0; i < src.length; i++) {
				dest[i] = src[i];
			}

			// 将src指向新数组
			src = dest;
		}

		int index = getNullIndex();
		src[index] = s;

	}

	/**
	 * 根据下标取出元素
	 * 
	 * @param index
	 *            要取出的元素的下标
	 * @return 返回取得的元素
	 */
	public E get(int index) {
		if (index < 0 || index >= size()) {
			throw new RuntimeException("给定的index超出范围:size:" + size()
					+ ",index:" + index);
		}

		E s = (E)src[index];
		return s;
	}

	/**
	 * 获得数组中的元素个数 返回数组中连续的不为null的元素个数
	 * 
	 * @return 返回获得的元素个数
	 */
	public int size() {
		int count = 0;
		for (int i = 0; i < src.length; i++) {
			if (src[i] != null) {
				count++;
			} else {
				break;
			}

		}

		return count;
	}

	/**
	 * 将指定的元素放入指定的位置
	 * 
	 * @param s
	 *            要放入的元素
	 * @param index
	 *            元素所在的位置
	 */
	public void insert(E s, int index) {
		if (size() >= src.length) {
			// 定义一个新数组,长度是原始数组长度+1
			Object[] dest = new Object[src.length + bilv];
			// 将原始数组中的数据考入新数组
			for (int i = 0; i < src.length; i++) {
				dest[i] = src[i];
			}

			// 将src指向新数组
			src = dest;
		}
		for(int i=size();i>index;i--){
			src[i]=src[i-1];
		}
		src[index]=s;
		
	}

	/**
	 * 修改指定位置的元素
	 * 
	 * @param s
	 *            修改后的新元素
	 * @param index
	 *            元素的位置
	 */
	public void modify(E s, int index) {
		src[index] = s;
	}

	/**
	 * 删除指定位置的元素
	 * 
	 * @param index
	 *            要删除的元素的位置
	 * @return 返回被删除的元素
	 */
	public E delete(int index) {
		E e = (E)src[index];
		for(int i=index;i<size();i++){
			src[i] =src[i+1]; 
		}
		
		return e;
	}

	/**
	 * 删除指定的元素
	 * 
	 * @param s
	 *            要删除的元素
	 */
	public void delete(E s) {
		int index = -1;
		for (int i = 0; i < src.length; i++) {
			if (src[i].equals(s)) {
				index = i;
				break;
			}
		}

		delete(index);
	}

}


在java 中 已经为我们定义了集合框架(接口)   Collection
Collection 表示一组对象,这些对象也称为 collection 的元素。一些 collection 允许有重复的元素,而另一些则不允许。一些 collection 是有序的,而另一些则是无序的。

Set    不允许重复元素的一组数据集合   无下标   无序
        HashSet    TreeSet
List   允许重复元素   带下标  有序
        ArrayList


HashSet:
此类实现 Set 接口,由哈希表(实际上是一个 HashMap 实例)支持。它不保证 set 的迭代顺序;特别是它不保证该顺序恒久不变。

将数据放入HashSet中
public static void hashSetDemo() {
		// 创建集合对象
		HashSet<String> set = new HashSet<String>();

		// 放入元素
		for (int i = 0; i < 10; i++) {
			String s = "张三" + i;
			set.add(s);
		}

		set.add("李四");
		boolean b = set.add("李四");
		System.out.println(b);

		boolean b2 = set.contains("李四");
		System.out.println(b2);

		// 取出元素,使用迭代器
		// Iterator<String> iter = set.iterator();
		// while(iter.hasNext()){
		// //取出并移除元素
		// String s = iter.next();
		// System.out.println(s);
		// }

		// 取出元素,使用增强for循环
		for (String s : set) {
			System.out.println(s);
		}

	}


对于set集合 取出集合中的元素  有两种方法

方法一  通过获得迭代器的方法

Set接口中  public Iterator<E> iterator() 函数
返回对此 set 中元素进行迭代的迭代器。返回元素的顺序并不是特定的
再通过  Iterator类中的  E next() 返回迭代的下一个元素

Iterator<String> iter = set.iterator();
 while(iter.hasNext()){
	//取出并移除元素
         String s = iter.next();
        System.out.println(s);
 }


注:1 迭代器中 每取出一个元素  都会将元素移除迭代器  但对Set集合没哟影响
    2 Iterator类中hasNext()函数  如果仍有元素可以迭代,则返回 true


方法二 : 用使用增强for循环来取出元素

for (String s : set) {
			System.out.println(s);
		}





TreeSet:

public static void treeSetDemo(){
		//创建TreeSet对象
		TreeSet<Integer> set = new TreeSet<Integer>();
		
		set.add(100);
		set.add(80);
		set.add(110);
		set.add(120);
		set.add(119);
		set.add(1);
		
		Integer tt = new Integer(111);
		set.add(tt);
		
		Integer tt1 = new Integer(111);
		set.add(tt1);
		
//		返回此 set 中所包含元素的逆序视图
		NavigableSet<Integer> nset = set.descendingSet();
		
		for(int t:nset){
			System.out.println(t);
		}
		
		//获取并移除最后一个(最高)元素;如果此 set 为空,则返回 null。
//		while(!set.isEmpty()){
//			int t = set.pollLast();
//			System.out.println(t);
//		}
		
	}



接口 Map<K,V>   将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值。

键:是一个set,不重复,无下标  无序
值:每个键对应一个值,可重复

一个键只能对应一个值
一个值只能指向一个键



public static void main(String[] args) {
		//映射存储学号和姓名
		HashMap<Integer,String> map = new HashMap<Integer,String>();
		
		//放入数据
		map.put(123, "张三疯");
		map.put(124, "郭靖");
		map.put(125, "张无忌");
		map.put(126, "张翠山");
		
		//如果key重复,则会替换key对应的value
		map.put(126, "苗翠花");
		map.put(126, "翠花");
		
		/*
		//取出数据:根基EntrySet
		Set<Map.Entry<Integer, String>> set = map.entrySet();
		
		//Map.Entry:一个键值对就是一个Entry对象
		for(Map.Entry<Integer, String> entry:set){
			
			int key = entry.getKey();
			String value = entry.getValue();
			System.out.println(key+">>>"+value);
			
		}
		*/
		
		
		//遍历方式二:根据KeySet
		Set<Integer> set = map.keySet();
		for(int key:set){
			String value = map.get(key);
			System.out.println(key+">>>"+value);
		}
		
	}



注:
1  HashMap中 如果key重复,则会替换key对应的value
2  Map取元素 有两种方法
    方法一:
    通过Map中Set<Map.Entry<K,V>> entrySet()方法  返回此映射中包含的映射关系的 Set 视图   再通过Set得到Map.Entry对象    K getKey()  返回与此项对应的键。 V getValue()  返回与此项对应的值。


    方法二:
    根据KeySet  返回此映射中包含的键的 Set 视图
    再通过   V get(Object key)  返回指定键所映射的值



练习:给定任意字符串,统计该字符串中每个字符出现的次数
String s="abbcccddddeeeee";

public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		String str = "abbcccddddeeeee";
		TreeMap<Character,Integer> map = new TreeMap<Character,Integer>();
		for(int i=0;i<str.length();i++){
			if(map.containsKey(str.charAt(i))){
				int b = map.get(str.charAt(i));
				map.put(str.charAt(i), ++b);
			}else{
				map.put(str.charAt(i), 1);
			}
		}
		//通过entrySet得到映射关系映射关系
//		Set<Entry<Character, Integer>> set=map.entrySet();
//		for(Entry<Character, Integer> q:set){
//			System.out.println(q.getKey()+"  "+q.getValue());
//		}
		
		
		//通过keySet包含的键的 Set   再通过键  得到 键所对应值
		Set<Character> t = map.keySet();
		for(char b:t){
			System.out.println(b+" "+map.get(b));
		}
		//迭代器循环取出元素
//      Iterator ter = tree.iterator();
//		
//		while(ter.hasNext()){
//			System.out.println(ter.next());
//		}
		
	}

    










分享到:
评论

相关推荐

    C语言数组计数

    C语言数组计数_简单,最基础的学习,让你初次认识C语言里面的数组。

    C#数组初始化简析

    题外话:学习.NET已经有一年了,从C#-&gt;ASP.NET-&gt;WPF。主要以看电子书为主,比较少写... 首先重二维数组与简单的交错数组的初始化与访问开始 代码如下: int[,] nums={ {1,2,3}, {1,2,0} }; for (int i = nums.GetLowerBo

    算法设计与分析-4动态规划金罐游戏.pptx

    我认识到动态规划其实是在简单重复递归的逻辑增加状态数组,通过对状态数组的求解而免去重复递归的资源和时间消耗,从而获得解。 动态规划算法的关键就是将问题分解为子问题,并找到两者之间的状态方程。分解子问题...

    算法设计与分析-4动态规划金罐游戏源代码.cpp

    我认识到动态规划其实是在简单重复递归的逻辑增加状态数组,通过对状态数组的求解而免去重复递归的资源和时间消耗,从而获得解。 动态规划算法的关键就是将问题分解为子问题,并找到两者之间的状态方程。分解子问题...

    pb动态生成菜单.txt

    那么就可以按照数组类型变量来处理,我们可以对其进行upperbound()、lowerbound()等函数操作,还可以进行数组的扩展,即添加新项目,这一点很重要,它是我们整篇文章的核心,如何利用PB实现动态添加菜单,...

    PB动态生成菜单

    那么就可以按照数组类型变量来处理,我们可以对其进行upperbound()、lowerbound()等函数操作,还可以进行数组的扩展,即添加新项目,这一点很重要,它是我们整篇文章的核心,如何利用PB实现动态添加菜单,...

    两两认识leetcode-LeetCodeCSharp:LeetCodeCSharp

    两两认识leetcode C# 中的 LeetCode 解决方案 第 1 部分已解决的问题列表 ID 标签 困难 解决方案 26 数组,两个指针 简单的 167 数组、两个指针、二分查找 简单的 242 字符串、哈希表 简单的 3 字符串、哈希表、两个...

    C++ 在堆上开辟与释放二维、三维指针详细解析

    学习C++新手通常会对指针的使用比较头疼,其实指针的概念很简单,只要能悟清楚这样一个简单的道理就能对指针有一定的认识了: 例如 int *a = new int[10]; 一维指针其实就相当于一维数组,不用去看书上所说的数组在...

    excel函数知识普及.rar

    1.7 数组的简单运用 1.8 相对、绝对、混合引用 2,常用函数 3,数学函数 4,文本函数 4.1 字符与字节 4.2 LEFT、RIGHT函数 4.3 MID函数 4.4 LEN函数 4.5 FIND函数 4.6 SEARCH函数 4.7 综合运用一 ...

    微信小程序组件参数传递

    本文档以简单清晰的逻辑业务帮助大家认识小程序中组件传递的使用,

    Android编程入门很简单.(清华出版.王勇).part1

    6.2.4使用String数组资源 6.2.5使用Color资源 6.2.6使用Dimension资源 6.2.7使用Drawble资源 6.2.8使用样式 6.2.9使用主题 6.3 小结 第7章设计界面布局 7.1创建界面 7.1.1 使用xml资源创建布局 7.1.2使用代码创建...

    算法设计与分析PPT(C语言完整版)

    4.5.1认识动态规划 4.5.2动态规划算法设计框架 4.5.3突出阶段性的动态规划应用 4.5.4突出递推的动态规划应用 4.6算法策略间的比较 4.6.1不同算法策略特点小结 4.6.2算法策略间的关联 4.6.3算法策略侧重的问题类型 ...

    Android编程入门很简单.(清华出版.王勇).part2

    6.2.4使用String数组资源 6.2.5使用Color资源 6.2.6使用Dimension资源 6.2.7使用Drawble资源 6.2.8使用样式 6.2.9使用主题 6.3 小结 第7章设计界面布局 7.1创建界面 7.1.1 使用xml资源创建布局 7.1.2使用代码创建...

    面向对象技术与UML课件及源代码-by 南邮-陈杨

    本书采用Java语言进行描述,针对Java技术标准编程进行详细的讲解,以简单通俗易懂的案例,逐步引领读者从基础到各个知识点进行学习。本书涵盖了JavaSE开发环境配置、程序设计基础、面向对象相关技术、常用API、UML...

    Excel函数知识普及 1-3季

    Excel函数知识普及 1.1 前言 1.2 认识了解公式相关的术语 1.3 认识了解与函数相关的知识 1.4到1-6 IF函数入门 1.7 数组的含义及用法 1.7 数组的简单运用 1.8 相对、绝对、混合引用

    对浅拷贝、深拷贝、写时拷贝的简单认识

    浅拷贝 也称位拷贝或值拷贝。如果对象中管理资源,编译器只是将对象中的值拷贝过来,就会导致多个资源共享一份资源,当一个对象销毁时就会将该资源释放,而这时另一些对象不知道该资源已经被释放,以为还有效,所以...

    七天学会易语言图解教程

    第六章学习静态变量、变量数组及动态管理变量。第七章介绍组件的应用,并用几个简单的小例程来了解组件的属性,事件,和方法。第八章主要介绍“易语言”子程序的调用方法、子程序参数的使用方法以及参数属性的相关...

    十天学会易语言图解教程

    第六章学习静态变量、变量数组及动态管理变量。第七章介绍组件的应用,并用几个简单的小例程来了解组件的属性,事件,和方法。第八章主要介绍“易语言”子程序的调用方法、子程序参数的使用方法以及参数属性的相关...

    《易语言十天图解教程》.易公司

    第六章学习静态变量、变量数组及动态管理变量。第七章介绍组件的应用,并用几个简单的小例程来了解组件的属性,事件,和方法。第八章主要介绍“易语言”子程序的调用方法、子程序参数的使用方法以及参数属性的相关...

    小冷VIP系列教程(第一部分:易语言编程教程)

    1.1 认识易语言。1.2 第一个程序。1.3 数据类型和函数参数。1.4 子程序与变量。1.5 窗口组件事件。1.6 代码执行流程。1.7 自定义数据类型和常量。1.8 易语言的数组。1.9 API声明与模块函数调用。2.0 资源表与窗口...

Global site tag (gtag.js) - Google Analytics