毕设的时候,有一个特殊需求,就是 访问ognl中 set 集合中 第一个元素。但是由于 set集合 是无序的。因此
-------------------------------action------------------------
Set<Person set=new HashSet<person();
setadd(new Person(张三1,24));
setadd(new Person(张三2,22));
setadd(new Person(张三3,21));
setadd(new Person(张三4,20));
---------------------------------jsp--------------------------
<s:property value=set[0]name / -----------------------------------这样 是不能显示任何信息的。
因为 set是 无序。不能像 list那样 list[1] map[key] 那样 直接访问
-----------------------------------------------解决方法----------------------------------------------------
写一个 静态方法。然后让ognl调用显示
-------------------------------静态方法--------------------
package comshuangXingtools;
import javautilIterator;
import javautilSet;
public class ShuangXingTools {
//获取 set中的第一个元素
public static <T Object getSet(Set<T set){
Iterator it= setiterator() ;
return itnext();}}-------------------------------jsp--------------------
<s:property value=@comshuangXingtoolsShuangXingTools@getSet(set)name/
------------------------------输出结果-------------------
----------------------------------
set是集容器。它的结构特征就是里面的元素是唯一且无序。
无序意味着不便于或不能随机存取 *** 作,就不适用“第2个”这样读。
强行去这么去获得数据,是违反STL设计初衷的。拿错了工具,拿钳子做螺丝刀的活。
如果要用于第n个这样的随机 *** 作,请转换或直接适用Vector这样的容器。Vector的随机效率是O(1)最快。
应用stl的关键在于选择合适的容器。
Collection:List、Set
Map:HashMap、HashTable
如何在它们之间选择
一、Array ,Arrays
Java所有“存储及随机访问一连串对象”的做法,array是最有效率的一种
1、
效率高,但容量固定且无法动态改变
array还有一个缺点是,无法判断其中实际存有多少元素,length只是告诉我们array的容量
2、Java中有一个Arrays类,专门用来 *** 作array
arrays中拥有一组static函数,
equals():比较两个array是否相等array拥有相同元素个数,且所有对应元素两两相等
fill():将值填入array中
sort():用来对array进行排序
binarySearch():在排好序的array中寻找元素
Systemarraycopy():array的复制
二、Collection ,Map
若撰写程序时不知道究竟需要多少对象,需要在空间不足时自动扩增容量,则需要使用容器类库,array不适用
1、Collection 和 Map 的区别
容器内每个为之所存储的元素个数不同
Collection类型者,每个位置只有一个元素
Map类型者,持有 key-value pair,像个小型数据库
2、各自旗下的子类关系
Collection
--List:将以特定次序存储元素所以取出来的顺序可能和放入顺序不同
--ArrayList / LinkedList / Vector
--Set :不能含有重复的元素
--HashSet / TreeSet
Map
--HashMap
--HashTable
--TreeMap
3、其他特征
List,Set,Map将持有对象一律视为Object型别
Collection、List、Set、Map都是接口,不能实例化
继承自它们的 ArrayList,Vector,HashTable,HashMap是具象class,这些才可被实例化
vector容器确切知道它所持有的对象隶属什么型别vector不进行边界检查
三、Collections
Collections是针对集合类的一个帮助类提供了一系列静态方法实现对各种集合的搜索、排序、线程完全化等 *** 作
相当于对Array进行类似 *** 作的类——Arrays
如,Collectionsmax(Collection coll); 取coll中最大的元素
Collectionssort(List list); 对list中元素排序
四、如何选择
1、容器类和Array的区别、择取
容器类仅能持有对象引用(指向对象的指针),而不是将对象信息copy一份至数列某位置
一旦将对象置入容器内,便损失了该对象的型别信息
2、
在各种Lists中,最好的做法是以ArrayList作为缺省选择当插入、删除频繁时,使用LinkedList();
Vector总是比ArrayList慢,所以要尽量避免使用
在各种Sets中,HashSet通常优于HashTree(插入、查找)只有当需要产生一个经过排序的序列,才用TreeSet
HashTree存在的唯一理由:能够维护其内元素的排序状态
在各种Maps中
HashMap用于快速查找
当元素个数固定,用Array,因为Array效率是最高的
结论:最常用的是ArrayList,HashSet,HashMap,Array
注意:
1、Collection没有get()方法来取得某个元素只能通过iterator()遍历元素
2、Set和Collection拥有一模一样的接口
3、List,可以通过get()方法来一次取出一个元素使用数字来选择一堆对象中的一个,get(0)(add/get)
4、一般使用ArrayList用LinkedList构造堆栈stack、队列queue
5、Map用 put(k,v) / get(k),还可以使用containsKey()/containsValue()来检查其中是否含有某个key/value
HashMap会利用对象的hashCode来快速找到key
hashing
哈希码就是将对象的信息经过一些转变形成一个独一无二的int值,这个值存储在一个array中
我们都知道所有存储结构中,array查找速度是最快的所以,可以加速查找
发生碰撞时,让array指向多个values即,数组每个位置上又生成一个梿表
6、Map中元素,可以将key序列、value序列单独抽取出来
使用keySet()抽取key序列,将map中的所有keys生成一个Set
使用values()抽取value序列,将map中的所有values生成一个Collection
为什么一个生成Set,一个生成Collection那是因为,key总是独一无二的,value允许重复
import javautilArrayList;
import javautilHashSet;
import javautilList;
import javautilSet;
public class test2 {
public static void main(String[] args) {
List<String> list1 = new ArrayList<String>();
list1add("1");
list1add("1");
list1add("2");
list1add("3");
list1add("5");
list1add("8");
list1add("1");
Set<String> set = new HashSet<String>();
setaddAll(list1);
Systemoutprintln(list1size()-setsize());
}
}
List中可以存放重复的数据,但是Set中不能存放重复的数据,所以把List转为Set后,就只剩下不重复的数据了,总数-不重复的个数=重复的个数。
遍历数组,并用字典集合Dictionary<T>存放每个元素出现的次数统计结果。
例如,统计一个整型数组中每个数组元素出现的次数,实现方法如下:
(1)在Visual Studio 中创建一个“控制台应用程序”项目
(2)Programcs
using System;using SystemCollectionsGeneric;
using SystemLinq;
namespace ConsoleApplication1
{
class ItemInfo
{
/// <summary>
/// ItemInfo 类记录数组元素重复次数
/// </summary>
/// <param name="value">数组元素值</param>
public ItemInfo(int value)
{
Value = value;
RepeatNum = 1;
}
/// <summary>
/// 数组元素的值
/// </summary>
public int Value { get; set; }
/// <summary>
/// 数组元素重复的次数
/// </summary>
public int RepeatNum { get; set; }
}
class Program
{
static void Main(string[] args)
{
// 待统计的整型数组
int[] a = { 1, 1, 1, 3, 1, 2, 2, 1, 3, 4, 2, 1, 5, 3, 4 };
// 集合 dic 用于存放统计结果
Dictionary<int, ItemInfo> dic =
new Dictionary<int, ItemInfo>();
// 开始统计每个元素重复次数
foreach (int v in a)
{
if (dicContainsKey(v))
{
// 数组元素再次,出现次数增加 1
dic[v]RepeatNum += 1;
}
else
{
// 数组元素首次出现,向集合中添加一个新项
// 注意 ItemInfo类构造函数中,已经将重复
// 次数设置为 1
dicAdd(v, new ItemInfo(v));
}
}
foreach (ItemInfo info in dicValues)
{
ConsoleWriteLine("数组元素 {0} 出现的次数为 {1}",
infoValue, infoRepeatNum);
}
}
}
}
(3)运行结果
vector:
Constructors 构造函数
Operators 对vector进行赋值或比较
assign() 对Vector中的元素赋值
at() 返回指定位置的元素
back() 返回最末一个元素
begin() 返回第一个元素的迭代器
capacity() 返回vector所能容纳的元素数量(在不重新分配内存的情况下)
clear() 清空所有元素
empty() 判断Vector是否为空(返回true时为空)
end() 返回最末元素的迭代器(译注:实指向最末元素的下一个位置)
erase() 删除指定元素
front() 返回第一个元素
get_allocator() 返回vector的内存分配器
insert() 插入元素到Vector中
可以使用LinkedHashSet
LinkedHashSet
LinkedHashSet集合同样是根据元素的hashCode值来决定元素的存储位置,但是它同时使用链表维护元素的次序。这样使得元素看起 来像是以插入顺序保存的,也就是说,当遍历该集合时候,LinkedHashSet将会以元素的添加顺序访问集合的元素。
LinkedHashSet在迭代访问Set中的全部元素时,性能比HashSet好,但是插入时性能稍微逊色于HashSet。
第一步,打开eclipse开发工具,新建静态页面mapsizehtml,如下图所示:
第二步,在<body></body>插入一个输入框和一个按钮,设置它们id属性,如下图所示:
第三步,编写函数querySize,声明一个Map集合,利用set方法添加元素,然后将获取Map集合元素个数赋值给输入框,如下图所示:
第四步,然后在button绑定onclick事件,保存代码,如下图所示:
第五步,启动Tomcat服务器,在浏览器中查看页面效果,单击按钮,查看输入框显示数字,如下图所示:
第六步,再次修改代码,对Map集合添加元素,再次预览页面,查看效果,如下图所示:
以上就是关于ognl 怎么访问 set 集合中指定位置的元素全部的内容,包括:ognl 怎么访问 set 集合中指定位置的元素、STL中set能不能返回指定的第几个元素的值、用哪个函数可以随机抽取集合中的元素等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)