面向对象基础(class0425)字符串与集合

常用类库

学习.net就是学习它的无数个类库怎么用,先看两个简单的

String 字符串,不可变特性。字符串可以看成字符数组

属性 Length

方法

IsNullOrEmpty() 静态方法

ToCharArray()

ToLower()

string不可变性

ToUpper()

Equals() 忽略大小写的比较

Join() 静态方法

Format () 静态方法

IndexOf()

LastIndexOf()

Substring()

Split()

Replace() Trim()  Contains()

字符串的处理练习1

课上练习1:接收用户输入的字符串,将其中的字符以与输入相反的顺序输出。"abc"→"cba"

课上练习2:接收用户输入的一句英文,将其中的单词以反序输出。 “I love you"→“uoy evol I"

课上练习3:”2012年12月21日”从日期字符串中把年月日分别取出来,打印到控制台

课上练习4:把csv文件中的联系人姓名和电话显示出来。简单模拟csv文件,csv文件就是使用,分割数据的文本

"张","三","15011111111";
"李","四","15011111112";
"王","五","15011111113";
"赵","六","15011111114"

练习5:“192.168.10.5[port=21,type=ftp]”,这个字符串表示IP地址为192.168.10.5的服务器的21端口提供的是ftp服务,其中如果“,type=ftp”部分被省略,则默认为http服务。请用程序解析此字符串,然后打印出“IP地址为***的服务器的***端口提供的服务为***”

练习6:原字符串123-456--789----123-2,求123-456-789-123-2

练习7:从文件路径中提取出文件名(包含后缀) 。比如从c:/a/xxx.avi中提取出xxx.avi这个文件名出来

练习8:求员工工资文件中,员工的最高工资、最低工资、平均工资 张三,20 李四,21

string ss = "123-456--789----123-2";
            ss = ss.Replace("-", " ");
            string[] slist = ss.Split(new char[]{‘ ‘}, StringSplitOptions.RemoveEmptyEntries);
            Console.WriteLine(string.Join("-",slist));

常用类库

StringBuilder高效的字符串操作

StringBuilder != String

StringBuilder sb = new StringBuilder();

sb.Append();

sb.ToString();

sb.Insert();

sb.Replace();

案例:使用程序拼html中的table

集合类

集合常用操作 添加、遍历、删除

命名空间System.Collections

ArrayList 可变长度数组,使用类似于数组

属性 Capacity Count

方法

Add() AddRange() Remove() RemoveAt() Clear() Contains() ToArray()

Hashtable 键值对的集合,类似于字典

案例:两个集合{ “a”,“b”,“c”,“d”,“e”}和{ “d”, “e”, “f”, “g”, “h” },把这两个集合去除重复项合并成一个

案例:随机生成10个1-100之间的数放到ArrayList中,要求这10个数不能重复,并且都是偶数

练习:有一个字符串是用空格分隔的一系列整数,写一个程序把其中的整数做如下重新排列打印出来:奇数显示在左侧、偶数显示在右侧。

比如‘2 7 8 3 22 9’显示成‘7 3 9 2 8 22’。

ArrayList al1 = new ArrayList() { "a","b","c","d","e"};
            ArrayList al2 = new ArrayList() { "d", "e", "f", "g", "h" };
            ArrayList al3 = new ArrayList();

            al3.AddRange(al1);
            foreach (string str in al2)
            {
                if (!al3.Contains(str))
                {
                    al3.Add(str);
                }
            }
            foreach (string str in al3)
            {
                Console.WriteLine(str);
            }

============================
    ArrayList al = new ArrayList();
            Random r = new Random();
            while (true)
            {
                int n = r.Next(1, 101);
                if (n % 2 == 0)
                {
                    al.Add(n);
                }
                if (al.Count == 10)
                {
                    break;
                }
            }

=======================================
string s = "5 8 9 10 11 22 4 3";
            ArrayList al1 = new ArrayList();
            ArrayList al2 = new ArrayList();

            string[] arr = s.Split(‘ ‘);
            foreach (string item in arr)
            {
                int n = int.Parse(item);
                if (n % 2 != 0)
                {
                    al1.Add(n);
                }
                else
                {
                    al2.Add(n);
                }
            }

(*)foreach

实现了IEnumerable(getEnumerator())、IEnumerable<T>的接口都可以使用foreach进行遍历。

我们可以自己写一个类使用foreach来遍历

案例:MyList 在这里可以发现foreach只允许读取数据,而不能修改数据 集合要支持foreach方式的遍历,必须实现IEnumerable接口(还要以某种方式返回实现了IEnumerator 的对象)

IEnumerator让foreach实现了查找下一项的能力

private int index;
        private string[] names;

        public MyList(int num) {
            index = -1;
            names = new string[num];
        }

        #region IEnumerator 成员

        //返回当前元素
        public object Current
        {
            get {
                return names[index];
            }
        }
        //访问下一个元素,如果有返回true,否则返回false
        public bool MoveNext()
        {
            index ++;
            if(index >= names.Length){
                return false;
            }
            else{
                return true;
            }
        }
        //将索引置于第一个索引之前
        public void Reset()
        {
            index = -1;
        }

        #endregion

        #region IEnumerable 成员
        //返回枚举器,当前类实现了IEnumerator,要对当前对象进行遍历所以返回this
        public IEnumerator  GetEnumerator()
        {
            return (IEnumerator)this;
        }

        #endregion

从这两个接口的用词选择上,也可以看出其不同:IEnumerable是一个声明式的接口,声明实现该接口的class是“可枚举(enumerable)”的,但并没有说明如何实现枚举器(iterator);IEnumerator是一个实现式的接口,IEnumerator object就是一个iterator。

IEnumerable和IEnumerator通过IEnumerable的GetEnumerator()方法建立了连接,client可以通过IEnumerable的GetEnumerator()得到IEnumerator object,在这个意义上,将GetEnumerator()看作IEnumerator object的factory method也未尝不可。

泛型集合

书橱

命名空间System.Collections.Generic

List<T>类似于ArrayList

Dictionary<K,V>类似于Hashtable

T,K,V就像一把锁,锁住集合只能存某种特定的类型,这里的T,K,V也可以是其它字母

泛型集合可以进行foreach遍历,是因为实现了IEnumerable<T>

T/K/V是占位符,给数据类型占位 ,一旦替换为某种类型(可以是自己写的类),那么集合中只能存储这种类型的数据
这就是泛型集合

泛型集合

案例:把分拣奇偶数的程序用泛型实现。

练习:将int数组中的奇数放到一个新的int数组中返回 从一个整数的ArrayList、List<int>中取出最大数。别用max方法。

练习:汉英翻译

练习:编写一个函数进行日期转换,将输入的中文日期转换为阿拉伯数字日期,比如:二零一二年十二月月二十一日要转换为2012-12-21。

练习:计算字符串中每种字符出现的次数(面试题)。“Welcome to Chinaworld”,不区分大小写,打印“W2”“e 2”“o 3”……

string date = "二零一二年十二月二十一日";
            string[] arr = ziDian.Split(‘ ‘);
            foreach (string item in arr)
            {
                dic.Add(item.Substring(0, 1), item.Substring(1, 1));
            }
            Console.WriteLine(GetNum(date));
        }
        Dictionary<string, string> dic = new Dictionary<string, string>();
        string ziDian = "零0 一1 二2 三3 四4 五5 六6 七7 八8 九9";
        string GetNum(string date)
        {
            string newDate = "";
            for (int i = 0; i < date.Length; i++)
            {
                string num = date[i].ToString();
                if (num != "十")
                {
                    if (dic.ContainsKey(num))
                    {
                        newDate += dic[num];
                    }
                    else
                    {
                        newDate += num;
     }
                }
                else
                {
                    if (i > 0 && i < date.Length)
                    {
                        string previousString = date.Substring(i - 1, 1);
                        string nextString = date.Substring(i + 1, 1);
                        if (dic.ContainsKey(previousString) && dic.ContainsKey(nextString))
                        {
                        }
                        else if (dic.ContainsKey(nextString))
                        {
                            newDate += "1";
                        }
                        else if (dic.ContainsKey(previousString))
                        {
                            newDate += "0";
                        }
                        else
                        {
                            newDate += "10";
  }
                    }
                }
            }
            return newDate.Replace("年","-").Replace("月","-").Replace("日","");
        }
string s = "Welcome to Chinaworld";
            Dictionary<char, int> dict = new Dictionary<char, int>();//key为字符,value为出现的次数
            foreach (char ch in s.ToLower())
            {
                if (dict.ContainsKey(ch))//如果dict中含有这个字符就在出现次数上增加1
                {
                    //dict[ch]++;
                    dict[ch] = dict[ch] + 1;
                }
                else
                {
                    dict[ch] = 1;//如果不存在就初始化为1
                }
            }
            foreach (char ch in dict.Keys)
            {
                Console.WriteLine("{0}出现{1}次",ch,dict[ch]);
            }

面向对象基础(class0425)字符串与集合,布布扣,bubuko.com

时间: 2024-10-06 08:08:14

面向对象基础(class0425)字符串与集合的相关文章

Python基础语法&mdash;字符串&amp;语句&amp;集合

Python字符串 Python中不支持char单字符类型,单字符在Python中也是一个字符串 Python字符串更新 更新Python字符串方法 1234 var1 = 'Hello World!'print "Updated String :- ", var1[:6] + 'Python' 实际执行效果为 Updated String :- Hello Python Python转义字符 Python字符串运算符 Python字符串格式化 Python三引号(triple quo

Swift的基础,操作符,字符串和集合类型

这篇文章主要讲解苹果Swift官方指南的第二章前四节的要点内容,如果想看完整的英文文档可以去苹果开发者页面下载. Basic 声明常量let 声明变量var 注释依旧使用"//" "/**/", 注意这里"/**/"在Swift可以嵌套使用 表达式结尾不再有分号 整数 你可以声明为Int或者UInt,他们本身适应不同平台(64位, 32位),类似于NSInteger,NSUInteger 也可以直接声明为指定字节数的Int,如: Int8, In

[.net 面向对象编程基础] (17) 数组与集合

[.net 面向对象编程基础] (17) 数组与集合 学习了前面的C#三大特性,及接口,抽象类这些相对抽象的东西以后,是不是有点很累的感觉.具体的东西总是容易理解,因此我们在介绍前面抽象概念的时候,总是举的是具体的实例以加深理解. 本节内容相当具体,学起来也相当轻松. 1.数组 1.1 什么是数组? 数组是一种数据结构,包含同一个类型的多个元素. 1.2数组的初始化 string[] mystringArray; 类型+方框号 数组名 1.3数组初始化 我们知道数组是引用类型,所以需要给他分配堆

【Java面向对象基础(一)】数据类型与运算符

[喵"的Android之路][基础篇(一)][Java面向对象基础]数据类型与运算符 1.数据类型介绍 在Java中,数据类型分为两种:基本数据类型和引用类型. 基本数据类型共8种,见下表: 基本数据类型 字节数 二进制位数 最小值 最大值 默认值 byte 1 8-bit -2^7 +2^7 - 1 0 short 2 16-bit -2^15 +2^15 - 1 0 int 4 32-bit -2^31 +2^31 - 1 0 long 8 64-bit -2^63 +2^63 - 1 0

[WuDe]C#程序设计教程 - 第2章 C#面向对象基础

第2章 C#面向对象基础 2.1 类 类是一种数据类型,而对象是具有这种类型的变量 [类的修饰符] class 类名 [:基类名] { //类的成员 }[;] 访问级别的用处在于控制成员在哪些地方可以被访问,这样达到面向对象中"封装"的目的;控制对外访问权限 在类这个级别,不写访问修饰符默认为internal,类只有两个访问修饰符,public 和internal (暂时这样理解),在类里面,方法外定义变量或方法前不加访问修饰符,默认为private Public公共类:不受限制对该类

Python第十八课(面向对象基础)

Python第17课(面向对象基础)    >>>思维导图>>>中二青年 什么是继承? 继承是一种关系,描述两个对象之间,什么是什么的关系 例如麦兜,佩奇,猪刚鬣 都是猪啊, 在程序中,继承描述的是类和类之间的关系 例如a继承了b, a就能直接使用b已经存在的方法和属性 a称之为子类,b称之为父类,也称之为基类 为什么要使用继承 继承的一方可以直接使用被继承一方已经有的东西 其目的是为了重用已经有的代码,提高重用性 如何使用继承 语法 class 类名称(父类的名称):

软件工程——理论、方法与实践 之 面向对象基础

软件工程——理论.方法与实践 之 面向对象基础 面向对象技术是软件工程领域中的重要技术,这种技术比较自然的模拟了人类认识客观世界的方式,是当前计算机软件工程学中的主流方法.面向对象方法认为:客观世界是由对象组成的,任何客观的事物或实体都是对象,复杂的对象可以由简单的对象组成:具有相同数据和相同操作的对象可以归并为一个类,对象是对象类的一个实例:类可以派生出子类,子类继承父类的全部特性(数据和操作),又可以有自己的新特征,子类与父类形成类的层次结构:对象之间通过消息传递相互联系:类具有封装性,其数

附录A培训实习生-面向对象基础(2):构造方法和带参数的构造方法

构造方法,又叫构造函数,其实就是对类进行实例化.构造方法与类同名,无返回值,也不需要void,在new时候调用.也就是说,就是调用构造方法的时候. 所有类都有构造方法,如果你不编码则系统默认生成空的的构造方法,如你有定义构造方法,那么默认的构造方法就会失效. 有参数的构造方法:比如我们希望每个小猫一诞生都有姓名,那么就应该写一个有参数的构造方法. 这是一个有参数的构造方法,可以看下: 1 using System; 2 using System.Collections.Generic; 3 us

【Java面向对象基础(三)】面向对象思想

[喵"的Android之路][基础篇(三)][Java面向对象基础]面向对象思想 1 面向对象的WWH 1.1 What--什么是面向对象 首先,要理解“对象”.在Thinking in Java中提到“Everything is an object”,即万物皆对象.这里的“对象”指的是任何实体或者任何可以当作实体看待的“虚幻的事物”.比如现实中的人(男人.女人.老人.小孩而...).动物(大象.狮子.猴子...).桌子.凳子.汽车.ATM机等等,也可以使看不见摸不着的空气(氧气.二氧化碳.氮气