合并表记录(集合与泛型)
来源:互联网 发布: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));
}
}
}
}
- 合并表记录(集合与泛型)
- 合并表记录(map)
- 华为OJ(合并表记录)
- 华为OJ(合并表记录)
- 合并表记录(华为机试题)
- 合并表记录
- 合并表记录
- 合并表记录
- 合并表记录
- 合并表记录
- 合并表记录
- 合并表记录
- 合并表记录
- 009-合并表记录
- 合并表记录
- 合并表记录
- 合并表记录
- 合并表记录
- 【驱动】GPIO 作为按键时的 设备树 配置
- 单调队列优化多重背包
- Spark Standalone
- 进程与线程的区别
- Big-man与PHP的交战(一)——阅读PHP代码
- 合并表记录(集合与泛型)
- tensorflow: 激活函数(Activation_Functions) 探究
- 数学建模--插值
- Tensorflow学习笔记
- hdu6162 Ch’s gift(LCA)
- 整理的关于DOM的表格(四——DOM变化)
- Python数据类型之“序列概述与基本序列类型(Basic Sequences)”
- SharedPreferenceUtil
- 9.5联合作战战果