JS Map 和 List 的简单实现代码
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JS Map 和 List 的简单实现代码相关的知识,希望对你有一定的参考价值。
参考技术A 本篇文章是对在JS中Map和List的简单实现代码进行了详细的分析介绍 需要的朋友参考下 复制代码 代码如下: /* * MAP对象 实现MAP功能 * * 接口 * size() 获取MAP元素个数 * isEmpty() 判断MAP是否为空 * clear() 删除MAP所有元素 * put(key value) 向MAP中增加元素(key value) * remove(key) 删除指定KEY的元素 成功返回True 失败返回False * get(key) 获取指定KEY的元素值VALUE 失败返回NULL * element(index) 获取指定索引的元素(使用element key element value获取KEY和VALUE) 失败返回NULL * containsKey(key) 判断MAP中是否含有指定KEY的元素 * containsValue(value) 判断MAP中是否含有指定VALUE的元素 * values() 获取MAP中所有VALUE的数组(ARRAY) * keys() 获取MAP中所有KEY的数组(ARRAY) * * 例子 * var map = new Map(); * * map put("key" "value"); * var val = map get("key") * …… * */ function Map() this elements = new Array(); //获取MAP元素个数 this size = function() return this elements length; ; //判断MAP是否为空 this isEmpty = function() return (this elements length < ); ; //删除MAP所有元素 this clear = function() this elements = new Array(); ; //向MAP中增加元素(key value) this put = function(_key _value) this elements push( key : _key value : _value ); ; //删除指定KEY的元素 成功返回True 失败返回False this remove = function(_key) var bln = false; try for (i = ; i < this elements length; i++) if (this elements[i] key == _key) this elements splice(i ); return true; catch (e) bln = false; return bln; ; //获取指定KEY的元素值VALUE 失败返回NULL this get = function(_key) try for (i = ; i < this elements length; i++) if (this elements[i] key == _key) return this elements[i] value; catch (e) return null; ; //获取指定索引的元素(使用element key element value获取KEY和VALUE) 失败返回NULL this element = function(_index) if (_index < || _index >= this elements length) return null; return this elements[_index]; ; //判断MAP中是否含有指定KEY的元素 this containsKey = function(_key) var bln = false; try for (i = ; i < this elements length; i++) if (this elements[i] key == _key) bln = true; catch (e) bln = false; return bln; ; //判断MAP中是否含有指定VALUE的元素 this containsValue = function(_value) var bln = false; try for (i = ; i < this elements length; i++) if (this elements[i] value == _value) bln = true; catch (e) bln = false; return bln; ; //获取MAP中所有VALUE的数组(ARRAY) this values = function() var arr = new Array(); for (i = ; i < this elements length; i++) arr push(this elements[i] value); return arr; ; //获取MAP中所有KEY的数组(ARRAY) this keys = function() var arr = new Array(); for (i = ; i < this elements length; i++) arr push(this elements[i] key); return arr; ; 复制代码 代码如下: /** * js实现list * */ function List() this value = []; /* 添加 */ this add = function(obj) return this value push(obj); ; /* 大小 */ this size = function() return this value length; ; /* 返回指定索引的值 */ this get = function(index) return this value[index]; ; /* 删除指定索引的值 */ this remove = function(index) this value splice(index ); return this value; ; /* 删除全部值 */ this removeAll = function() return this value = []; ; /* 是否包含某个对象 */ this constains = function(obj) for ( var i in this value) if (obj == this value[i]) return true; else continue; return false; ; /* 是否包含某个对象 */ this getAll = function() var allInfos = ; for ( var i in this value) if(i != (value length )) allInfos += this value[i]+" "; else allInfos += this value[i]; alert(allInfos); return allInfos += this value[i]+" ";; ; lishixinzhi/Article/program/Java/JSP/201311/20400
List/Map 导出到表格(使用注解和反射)
Java 的 POI 库可以用来创建和操作 Excel 表格,有时候我们只需要简单地将 List 或 Map 导出到表格,样板代码比较多,不够优雅。如果能像 Gson 那样,使用注解标记要导出的属性,就方便的多。
Github:https://github.com/imcloudfloating/ListToExcell
POI 的依赖:
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.1.0</version>
</dependency>
1. 创建注解
package cloud.list2excel.annotation;
import org.apache.poi.hssf.util.HSSFColor;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Column
String title() default "";
short fontSize() default 14;
HSSFColor.HSSFColorPredefined fontColor() default HSSFColor.HSSFColorPredefined.BLACK;
HSSFColor.HSSFColorPredefined borderColor() default HSSFColor.HSSFColorPredefined.BLACK;
创建一个 @Column
注解,用于标记字段
title
:该字段在表格头部的名称,默认值为属性名。fontSize
:字体大小,默认 14px。fontColor
:字体颜色,默认黑色。borderColor
:边框颜色,默认黑色。
2. 使用反射获取注解,用 POI 将数据写入到表格
这部分用的 Kotlin,但是反射和注解还是用的 Java,因为 Kotlin 反射获取的字段是排过序的,不是声明的顺序。
package cloud.list2excel.util
import cloud.list2excel.annotation.Column
import org.apache.poi.hssf.usermodel.HSSFCellStyle
import org.apache.poi.hssf.usermodel.HSSFSheet
import org.apache.poi.hssf.usermodel.HSSFWorkbook
import org.apache.poi.ss.usermodel.BorderStyle
/**
* List/Map 导出 Excel 表格
* @author Cloud
*/
object ListToExcel
private var workbook: HSSFWorkbook = HSSFWorkbook()
private val cellStyles: MutableList<HSSFCellStyle> = ArrayList()
/**
* 处理单个 Sheet
*/
fun from(data: List<Any>): HSSFWorkbook
toWorkbook("Sheet0", data)
return workbook
/**
* 处理多个 Sheet
*/
fun from(data: Map<String, List<Any>>): HSSFWorkbook
if (data.isEmpty())
return workbook
for (sheet in data)
toWorkbook(sheet.key, sheet.value)
return workbook
private fun toWorkbook(sheetName: String, list: List<Any>)
val sheet = workbook.createSheet(sheetName)
if (list.isEmpty())
return
val headers: MutableList<String> = ArrayList()
val data: MutableList<MutableList<Any>> = ArrayList()
// 获取注解并设置表头
for (field in list[0].javaClass.declaredFields)
field.isAccessible = true
val annotation = field.getAnnotation(Column::class.java)
if (annotation != null)
headers.add(if (annotation.title == "") field.name else annotation.title)
val cellStyle = workbook.createCellStyle().also style ->
style.setFont(workbook.createFont().also
it.fontHeightInPoints = annotation.fontSize
it.color = annotation.fontColor.index
)
cellStyle.run
leftBorderColor = annotation.borderColor.index
topBorderColor = annotation.borderColor.index
rightBorderColor = annotation.borderColor.index
bottomBorderColor = annotation.borderColor.index
borderLeft = BorderStyle.THIN
borderTop = BorderStyle.THIN
borderRight = BorderStyle.THIN
borderBottom = BorderStyle.THIN
cellStyles.add(cellStyle)
// 获取数据
for (obj in list)
val rowData: MutableList<Any> = ArrayList()
for (field in obj.javaClass.declaredFields)
field.isAccessible = true
val annotation = field.getAnnotation(Column::class.java)
if (annotation != null)
val t = field.get(obj)
if (t == null)
rowData.add("")
else
rowData.add(t)
data.add(rowData)
setHeader(sheet, headers)
setData(sheet, data)
/**
* 设置表格头
*/
private fun setHeader(sheet: HSSFSheet, headers: List<String>)
val row = sheet.createRow(0)
for (i in headers.indices)
val cell = row.createCell(i)
cell.setCellValue(headers[i])
cell.setCellStyle(cellStyles[i])
/**
* 写入数据
*/
private fun setData(sheet: HSSFSheet, data: List<List<Any>>)
for (i in data.indices)
val row = sheet.createRow(i + 1)
for (j in data[i].indices)
val cell = row.createCell(j)
cell.setCellValue(data[i][j].toString())
cell.setCellStyle(cellStyles[j])
sheet.autoSizeColumn(j)
from()
的参数为 List
时,直接写入 workbook 然后返回,为 Map
时,将 Map
中的 List
逐个写入到 workbook,Map
的 key 作为 Sheet 的名称。
3. 使用
创建两个实体类测试:
package cloud.list2excel.util
import cloud.list2excel.annotation.Column
import org.apache.poi.hssf.util.HSSFColor
import java.sql.Date
data class Film(
@Column(title = "ID", fontColor = HSSFColor.HSSFColorPredefined.RED)
var id: Int? = null,
@Column(title = "Title")
var title: String? = null,
@Column(title = "Release Date")
var release_date: Date? = null,
@Column(title = "Duration")
var duration: String? = null
)
package cloud.list2excel.util
import cloud.list2excel.annotation.Column
import java.sql.Date
data class Actor(
@Column(title = "ID")
var id: Int? = null,
@Column(title = "Full Name")
var name: String? = null,
@Column(title = "Birth")
var birth: Date?=null
)
测试类:
此处写入了两个 Sheet。
package cloud.list2excel.util
import java.io.File
import java.sql.Date
class ListToExcelTest
private val films = listOf(
Film(1, "Iron Man", Date.valueOf("2008-4-30"), "126 min"),
Film(2, "Star Wars: Episode IV - A New Hope", Date.valueOf("1977-5-25"), "121 min"),
Film(3, "Zootropolis", Date.valueOf("2016-3-4"), "109 min")
)
private val actors = listOf(
Actor(1, "Robert John Downey Jr.", Date.valueOf("1965-4-4")),
Actor(2, "Mark Hamill", Date.valueOf("1951-9-25")),
Actor(3, "Ginnifer Goodwin", Date.valueOf("1978-5-22"))
)
private val data = mapOf(
Pair("films", films),
Pair("actors", actors)
)
@org.junit.Test
fun toExcel()
val before = System.currentTimeMillis()
val workbook = ListToExcel.from(data)
val after = System.currentTimeMillis()
println("Time Usage: $after - beforems")
workbook.write(File("/home/data.xls"))
导出结果:
效率似乎不怎么高 ^_^
以上是关于JS Map 和 List 的简单实现代码的主要内容,如果未能解决你的问题,请参考以下文章
用List来实现一个简单的Map(包含key, 和Value),这个简单Map需要提供(add, get, remove)的基本功能。
Java中集合框架,Collection接口Set接口List接口Map接口,已经常用的它们的实现类,简单的JDK源码分析底层实现
关于js中 .map()的问题,希望大神可以帮忙解读下这段代码的实现过程