Iterator迭代器
1.使用方法iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时,它返回序列的第一个元素。注意:iterator()方法是java.lang.Iterable接口,被Collection继承。
2. 使用next()获得序列中的下一个元素。
3. 使用hasNext()检查序列中是否还有元素。
4. 使用remove()将迭代器新返回的元素删除。
Integer.parseInt()
把()里的内容转换成整数。
Collections常用方法
1.Shuffle(element):洗牌方法,将当前集合内的数据进行随机排序。
2.Reverse(element):逆序排序,对当前集合的元素按照相反的顺序进行排序
3.Sort(element):对当前集合进行升序排序,实现Comparable接口的类,只能使用一种排序方案,这种方案叫作“自然比较”方案。
TreeSet 集合类
1、不能有重复的元素
2、具有排序功能(默认为字典序)可重写排序方法
3.TreeSet是有序的Set集合,因此支持add、remove等方法。
4.取元素时,不能直接取出,没有get(),需先转化为list。
ArrayList arrayList=new ArrayList<String>(t);
for(int i=0;i<arrayList.size();i++)
{
if(i==0)
System.out.print(arrayList.get(i));
else System.out.print(" "+arrayList.get(i));
}
练习:重写TreeSet的排序,让其实现按照字符串长度排序
import java.util.*;
public class Main {
public static void main(String[] args)
{
TreeSet ts = new TreeSet(new StringLengthComparator());
//把比较器传进构造函数,即以比较器作为参数,这样存入TreeSet时就会按照比较器定义的排序方法进行排序
ts.add("aaaaa");
ts.add("aaa");
ts.add("aaaa");
ts.add("a");
ts.add("aaaaaa");
ts.add("bbbb");
ts.add("w");
for(Iterator it = ts.iterator();it.hasNext();)
{
System.out.println(it.next());
}
}
}
class StringLengthComparator implements Comparator
//默认比较器是自然顺序,这里重写比较器为优先比较字符串长度。
//TreeSet底层数据结构是二叉树,比较器返回值是正数、零、负数3种,靠这3个来排序存储。
{
public int compare(Object o1,Object o2)
{
String s1 = (String)o1;
String s2 = (String)o2;
int num = new Integer(s1.length()).compareTo(new Integer(s2.length()));
//比较字符串长度,CompareTo()方法的返回值是正数、零、负数3种,大于为正数1,等于为0,小于为负数-1
if(num==0)
return s1.compareTo(s2);
//比较自然顺序
return num;
}
}
运行结果:
a
w
aaa
aaaa
bbbb
aaaaa
aaaaaa
ArrayList
特点:
有序的:按照添加的顺序
不唯一:同一个元素可以装多次
1:如何创建泛型对象
ArrayList<泛型> list=new ArrayList<>();
2:如何添加元素:
一次添加一个元素:
list.add(元素);
一次添加多个元素:
Collections.addAll(集合,元素,元素,…);
3:得到集合元素的个数
list.size();
4:得到某一个元素
list.get(下标);
5:如何判断集合里面是否出现指定元素
list.contains();
6:遍历
①循环遍历
for(int i=0;i<list.size();i++){
//i->下标
//list.get(i)->元素
}
②
for(集合的泛型 x :list){
//x->元素
}
③迭代器
for(得到迭代器对象;判断迭代器上面是否还有下一个元素;){
取出下一个元素
}
for(Iterator<泛型>It=list.iterator();It.hasNext;){
It.next();->元素
}
例题:
约瑟夫环问题-hebust
约瑟夫环是一个数学的应用问题:已知n个人(以编号a,b,c…分别表示)围坐在一张圆桌周围。从编号为1的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。
输入格式:
固定为2行,第一行为m,第二行为n个人的名称列表,用英文字母代表,元素直接使用英文逗号 , 分开
输出格式:
一行,为出列元素序列,元素之间使用英文逗号 , 分开【注意:末尾元素后没有逗号】
输入样例:
3
a,b,c,d,e,f,g
输出样例:
c,f,b,g,e,a,d
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
int m=scanner.nextInt();
scanner.nextLine();//清除回车
String str1=scanner.nextLine();
String[] str=str1.split(",");
List arrayList=new ArrayList<String>();
for(int i=0;i<str.length;i++) {
arrayList.add(str[i]);
}
int t=0;//注意:后面用到t=(t+1)%m,无法达到t=m,所以t要从0开始计数。
while(arrayList.size()>0) {
Iterator It=arrayList.iterator();//声明一个迭代器
while(It.hasNext()) {//判断是否还有元素可以迭代
String s=(String)It.next();//把迭代的下一个元素赋给s
if(t==m-1) {
if(arrayList.size()>1) {
//判断是否为最后一个元素
//控制输出格式
System.out.print(s+",");
}
else {
System.out.println(s);
}
It.remove();//清除刚才输出的元素
}
t=(t+1)%m;//让t重新变为0
}
}
scanner.close();
}
}
office文档页码打印
在office软件(word,excel)中,有时只需要打印整个文档中的一部分,就需要用户选择需要打印的页码范围。目前输入的页码范围格式定义为:以逗号分割,可以使用-表示连续页码。例如:1,3,5-9,20。表示需要打印的页码为1,3,5,6,7,8,9,20。
本题目要求读入一行字符串,作为需要打印的页码范围。需要注意以下几点:
1、页码范围输入可以不按顺序。例如:5,3,7,9-10,1-2;
2、连续的页码定义也可能不会按照由小到大的顺序输入。例如:1,9,5,20-15,10;
3、输入的页码范围可能会有重复。例如:1,9,15,5-10,12-20;
输入格式:
第一行:表示页码范围的格式化字符串
输出格式:
将需要打印的页码按照由小到大的顺序输出,以空格分割
输入样例:
1,3,5-9,20
输出样例:
1 3 5 6 7 8 9 20
输入样例:
12-20,1,15,9,5-10
输出样例:
1 5 6 7 8 9 10 12 13 14 15 16 17 18 19 20
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
String str1=scanner.nextLine();
String[] str=str1.split(",");
TreeSet t=new TreeSet();
List arrayList=new ArrayList<String>();
for(int i=0;i<str.length;i++) {
if(str[i].contains("-")) {
//如果包含“-”,说明是连续页码,需进行分割
String[] s=str[i].split("-");
int a=Integer.parseInt(s[0]);
int b=Integer.parseInt(s[1]);
if(a>b) {
int temp=b;
b=a;
a=temp;
}
for(int j=a;j<=b;j++) {
t.add(j);
}
}
else t.add(Integer.parseInt(str[i]));
}
arrayList=new ArrayList<String>(t);
Collections.sort(arrayList);
for(int i=0;i<arrayList.size();i++)
{
if(i==0)
System.out.print(arrayList.get(i));
else System.out.print(" "+arrayList.get(i));
}
System.out.println();
scanner.close();
}
}
sdust-Java-字符串集合求并集
从键盘接收N个英文字符串(其中不同的字符串数量大于10),从头开始取5个不同的字符串放入一个集合S1,然后接着取5个不同的字符串放入另一个集合S2,按照字母顺序输出S1和S2的并集中的每个字符串(字符串区分大小写)
输入格式:
一行以空格分开的英文字符串(不同的字符串数量大于10)。
输出格式:
按照字母顺序(先比较字符串首字母,首字母相同的比较字符串第二个字母,以此类推)输出的S1和S2并集的字符串。
输入样例:
android python java javaee javase database java jsp servlet java algorithm junit
输出样例:
algorithm
android
database
java
javaee
javase
jsp
python
servlet
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
TreeSet s1=new TreeSet();
//1、不能有重复的元素(已有元素无法重复添加)
//2、具有排序功能(默认为字典序)
TreeSet s2=new TreeSet();
String str1=scanner.nextLine();
String[] str=str1.split(" ");
for(int i=0;i<str.length;i++) {
if(s1.size()!=5) {
s1.add(str[i]);
}
else if(s2.size()!=5) {
s2.add(str[i]);
}
else break;
}
s1.addAll(s2);//二者取并集
for(Object s : s1) {
System.out.println(s);
}
scanner.close();
}
}