合并表记录(集合与泛型)

来源:互联网 发布:bat 算法工程师 编辑:程序博客网 时间:2024/06/06 01:37

1.题目

数据表记录包含表索引和数值,请对表索引相同的记录进行合并,即将相同索引的数值进行求和运算,输出按照key值升序进行输出。

2.知识点(此处转载)

1.集合




1.1、List

    List可以将元素维护在特定的序列中。List接口在Collection的基础上添加了大量的方法,使得可以在List的中间插入和移除元素。

    有两种类型的List实现:

·            基本的ArrayList,随机访问速度很快,但是在List中间插入和移除元素时较慢

·            LinkedList,特性与ArrayList相反,善于顺序访问,在List中间插入删除代价也较低。但随机访问比较慢,特性集比ArrayList更大。

1.2、Set

    存入Set中的每个元素都必须是唯一的,因为Set不保存重复的元素,加入Set的元素必须定义equals()方法以确保对象的唯一性

1.3 Map

Map提供了一种映射关系,其中的元素是以键值对(key-value)的形式存储的,能够实现根据key快速查找value;

建(key值)不可重复,value值可以重复,一个value值可以和很多key值形成对应关系,每个建最多只能映射到一个值。

Map支持泛型,形式如:Map<K,V>

Map中使用put(K key,V value)方法添加

2.泛型与集合

Java集合有一个缺点,就是把一个对象“丢进”集合里后,集合就会“忘记”这个对象的数据类型,当再次取出该对象时,该对象的编译类型就变成了Object类型(其运行时类型没变)。

 List list= new ArrayList();

    list.add(1);

    list.add(2);

    list.add("五号");//一不小心插入了String

     for (Object object: list){

        //取出“五号”时报ClassCastException

       Integert = (Integer)object;

  }

上面是一个集合没有使用泛型时出现的错误,那么当我们使用泛型时,该错误就会避免,例如:

    List<Integer>list = newArrayList<Integer>();

    list.add(1);

    list.add(2);

    list.add("五号");//插入String,引起编译错误

3、认识泛型

Java的参数化类型被称为泛型,即允许我们在创建集合时就指定集合元素的类型,该集合只能保存其指定类型的元素。

泛型允许在定义类、接口、方法时使用类型形参,这个类型形参将在声明变量、创建对象、调用方法时动态地指定。例如:

//定义一个接口

interface Money<E>{

   Eget(intindex);

   boolean add(E e);

}

//定义一个类

public classApple<T>{

   private T info;

   public Apple(Tinfo) {

     this.info = info;

   }

 

   public T getInfo(){

     return this.info;

   }

  

   public void setInfo(Tinfo){

     this.info = info;

   }

    

   public static void main(String[] args){

    Apple<String>ap1 = newApple<String>("小苹果");

    System.out.println(ap1.getInfo());

    Apple<Double>ap2 = newApple<Double>(1.23);

    System.out.println(ap2.getInfo());

   }

}

需要注意的是,在静态方法、静态初始化块或者静态变量的声明和初始化中不允许使用类型形参。因为不管为泛型的类型形参传入哪一种类型实参,对于Java来说,它们依然被当成同一个类处理,在内存中也只占用一块内存空间。不管泛型的实际类型参数是什么,它们在运行时总有同样的类(class),例如下面的程序将输出true。

4.访问map

标准的Map访问方法如下:
Set keys = map.keySet
( );
if
(keys != null) {
Iterator iterator = keys.iterator
( );
while
(iterator.hasNext( )) {
Object key = iterator.next
( );
Object value = map.get
(key);
;

;}
}
然后,这个方法有一个问题。从Map中取得关键字之后,我们必须每次重复返回到Map中取得相对的值,这是很繁琐和费时的。

幸运的是,这里有一个更加简单的途径。Map类提供了一个称为entrySet()的方法,这个方法返回一个Map.Entry实例化后的对象集。
接着,Map.Entry类提供了一个getKey()方法和一个getValue()方法,因此,上面的代码可以被组织得更符合逻辑。举例如下:
Set entries = map.entrySet
( );
if
(entries != null){
Iterator iterator = entries.iterator
( );
while
(iterator.hasNext( )) {
Map.Entry entry =iterator.next
( );
Object key = entry.getKey
( );
Object value = entry.getValue
();
;

}

}

5.各种map

一般情况下,我们用的最多的是HashMap,HashMap里面存入的键值对在取出的时候是随机的,它根据键的HashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度。在Map中插入、删除和定位元素,HashMap是最好的选择。
TreeMap
取出来的是排序后的键值对。但如果您要按自然顺序或自定义顺序遍历键,那么TreeMap会更好。
LinkedHashMap
HashMap的一个子类,如果需要输出的顺序和输入的相同,那么用LinkedHashMap可以实现,它还可以按读取顺序来排列,像连接池中可以应用。

 

3代码

package huaweijishi;
 
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;
import java.util.TreeMap;
 
public class string_practice {
 
        public static void main(String[] args) {
               // TODO 自动生成的方法存根
                Scanner sc = new Scanner(System.in);
                while (sc.hasNext()) {
                    Map<Integer, Integer> map = new HashMap<Integer, Integer>();
                    int n = sc.nextInt();
                    for (int i = 0; i < n; i++) {
                        int s=sc.nextInt();
                        int value=sc.nextInt();
                        if (map.containsKey(s)) {
                            map.put(s, map.get(s) + value);
                        } else
                            map.put(s, value);
                    }
                    Set<Integer> m = map.keySet();
                    for (Integer key : map.keySet()) {
                        System.out.println(key + " " + map.get(key));
                    }
                }
            }
}

 


原创粉丝点击