Java实验报告(实验6)
henu大二Java实验作业
实验目的:
1、掌握容器类的层次结构;
2、掌握Collection接口和List接口的常用方法;
3、掌握Iterator接口的使用方式;
4、掌握Set接口和hashCode的使用方式;
5、掌握Map接口的使用方式。
实验内容:
1.
将下列数据:“hello”、123、6.9、“hello”、“”、“Hello”、StringBuffer s=new StringBuffer(“abc”);中的s,添加到一个ArrayList对象中,并输出结果。
• 练习修改元素、获取元素、打印输出。
• 查找元素“hello”。
• 删除指定的元素“hello”。
• 将元素123替换为1000。
源代码:
import java.util.*;
public class S6_1 {
public static void main(String [] args){
StringBuffer s=new StringBuffer("abc");
ArrayList list=new ArrayList();
list.add("hello");
list.add(123);
list.add(6.9);
list.add("hello");
list.add("");
list.add("Hello");
list.add(s);
for(int i=0;i<list.size();i++){
System.out.println(list.get(i));
}
System.out.println("---");
Iterator it=list.iterator();
System.out.println("hello的位置为:");
for(int i=0;i<list.size();i++){
if("hello".equals(list.get(i))){
System.out.println(i);
}
}
while(it.hasNext()){
Object obj=it.next();
if("hello".equals(obj)){
it.remove();
}
}
list.set(list.indexOf(123),1000);
System.out.println("----");
for(int i=0;i<list.size();i++){
System.out.println(list.get(i));
}
}
}
运行效果:
2.
使用ArrayList集合,对其添加10个不同的元素,并使用Iterator遍历该集合。提示:
• 使用add()方法将元素添加到ArrayList集合中。
• 调用集合的iterator()方法获得Iterator对象,并调用Iterator的hasNext()和next()方法,迭代出集合中的所有元素。
• 查找键盘输入的元素。
• 将重复的元素删除。
import java.util.*;
public class S6_2 {
public static void main(String [] args){
ArrayList list=new ArrayList();
list.add("123");
list.add("123");
list.add("456");
list.add("456");
list.add("wonendie");
list.add("zjc");
list.add("zjc");
list.add("789");
list.add("adgdg");
list.add("789");
Iterator it=list.iterator();
while(it.hasNext()){
Object obj=it.next();
System.out.println(obj);
}
Scanner sc=new Scanner(System.in);
System.out.println("请输入要查找的数据:");
String s=sc.next();
for (int i = 0; i < list.size(); i++) {
if(s.equals(list.get(i))){
System.out.println("位置在:"+i);
}
}
HashSet<String> hs=new HashSet<String>();
hs.addAll(list);
list.clear();
list.addAll(hs);
System.out.println("删除重复后:"+list);
}
}
运行效果:
3.
去除集合中自定义对象(如Person类,属性包括姓名和年龄)的重复值(对象的成员变量值都相同)。
import java.util.*;
public class S6_3 {
public static void main(String [] args){
HashSet hs=new HashSet();
Person p1=new Person("张家城",18);
Person p4=new Person("李章曜",20);
Person p2=new Person("吴洲佳",19);
Person p3=new Person("张家城",18);
hs.add(p1);
hs.add(p2);
hs.add(p3);
hs.add(p4);
System.out.println(hs);
}
}
class Person{
public String name;
public int age;
public Person(String name,int age){
this.age=age;
this.name=name;
}
//重写toString 方法
public String toString(){
return name+":"+age;
}
//重写hashCode方法
public int hashCode(){
return name.hashCode();//返回name属性的散列值
}
//重写equals方法
public boolean equals(Object obj){
if(this==obj){
return true;
}
else if(!(obj instanceof Person)){
return false;
}
Person p=(Person) obj;
boolean b=this.name.equals(p.name);
return b;
}
}
运行结果;
4.
编写程序将一组学生对象的姓名和成绩存入到一个树集(TreeSet)中,完成以下要求:
• 使得按照成绩自动降序排列,并输出排序的结果。
• 从一个无序数组中,剔除重复元素,并按升序排序。
import java.util.TreeSet;
import java.util.*;
public class S6_5 {
public static void main(String [] args){
TreeSet ts=new TreeSet(new Comparator() {
@Override
public int compare(Object o1, Object o2) {
Student s1=(Student)o1;
Student s2=(Student)o2;
if(s1.score.hashCode()>(s2.score.hashCode())){
return -1;
}else if(s1.score.hashCode()<s2.score.hashCode()){
return 1;
}
else {
return s1.name.compareTo(s2.name);//当score相等时,比较name;
}
}
});
ts.add(new Student("98","zhang"));
ts.add(new Student("60","li"));
ts.add(new Student("60","ab"));
System.out.println(ts);
TreeSet st=new TreeSet();
st.add(123);
st.add(12);
st.add(12);
st.add(34);
st.add(356);
System.out.println(st);
}
}
class Student {
public String score;
public String name;
public Student(String score,String name){
this.score=score;
this.name=name;
}
public String toString() {
return score + ":" + name;
}
public int hashCode(){
return score.hashCode();
}
}
运行结果:
5.
编写一个程序,读取个数不定的整数,然后查找其中出现频率最高的数字。当输入为0时,表示结束输入。如:
如果输入的数据是2 3 40 3 54 -3 3 3 2 0,那么数字3的出现频率是最高的。请一次输入一个数字。
如果出现频率最高的数字不是一个而是多个,则应该将它们全部输出。例如:在线性表9 30 3 9 3 2 4中,3和9都出现了两次,3和9都应该输出。
提示:可以定义两个集合,一个存放所有输入的数据,另一个存放出现频率最高的数字。
import java.util.*;
public class S6_6
{
public static void main(String[] args)
{
Scanner reader=new Scanner(System.in);
HashMap<Integer,Integer> tm=new HashMap<Integer,Integer>();
while (true)
{
int a=reader.nextInt();
if (a==0)
{
break;
}
if (tm.containsKey(a))
{
int value1=tm.get(a);
value1++;
tm.put(a,value1);
}
else
{
tm.put(a,1);
}
}
Collection<Integer> c = tm.values();
Object[] obj = c.toArray();
Arrays.sort(obj);//升序排列
Set keySet=tm.keySet();
Iterator it2=keySet.iterator();
while (it2.hasNext())
{
Object key=it2.next();
Object value=tm.get(key);
if (obj[tm.size()-1]==value)
{
System.out.println("频率最高的数据为:");
System.out.println(key);
}
//System.out.println(key+":"+value);
}
}
}
运行结果:
数据:1 1 1 2 2 2 3 3 4 5
6.
统计字符串中每个单词出现的次数,使用HashMap来实现。例如:“Today, We have a class of java, as we kown, java is an object oriented programming language, and java is fun! wish you enjoy it!”,统计结果存储成以下形式:
a-->1
an-->1
and-->1
as-->1……
is-->2
提示:使用String.split(("[ \n\t\r.,;:!?()]")方法进行分词,空格,标点符号等。
import java.util.*;
public class S6_8 {
public static void main(String[] args) {
String str = "Today, We have a class of java, as we kown, java is an object oriented programming language, and java is fun! wish you enjoy it";
HashMap<String, Integer> hm = new HashMap<>(); //定义一个双列集合
String[] strs = str.split("[ \\n\\t\\r.,;:!?()]"); //分割成若干字符串
for (int i = 0; i < strs.length; i++) { //判断每个字符串,是存在于集合里
if (!hm.containsKey(strs[i])) {
hm.put(strs[i], 1); //如果不存在,则存进去
} else {
Integer counts = hm.get(strs[i]); //如果存在 ,先找到 此key对应的 value值
hm.put(strs[i], counts + 1); //覆盖前者的的key值,并且比前者多加一次
}
}
Iterator<String> it=hm.keySet().iterator(); //获取HashMap所有的key集合并遍历
while(it.hasNext()) {
String keyName=it.next();
System.out.println(keyName+"->"+hm.get(keyName));
}
}
}
运行结果: