精华内容
下载资源
问答
  • sci检索没有馆藏 您是否曾经想替换过HashSet或HashMap使用的equalshashCode方法? 或者有一个List的一些元素类型伪装成的List相关类型的? 转换集合使这成为可能,并且本文将展示如何实现。 总览 转换集合...

    sci检索没有馆藏号

    您是否曾经想替换过HashSetHashMap使用的equalshashCode方法? 或者有一个List的一些元素类型伪装成的List相关类型的?

    转换集合使这成为可能,并且本文将展示如何实现。

    总览

    转换集合是LibFX 0.3.0的一项功能,该功能将在每天的今天发布。 这篇文章将介绍总体思路,涵盖技术细节并完成一些可能会派上用场的用例。

    正在进行的示例是LibFX中包含的功能演示的稍微改编的变体。 请记住,这只是演示该概念的一个示例。

    转变馆藏

    转换集合是另一个集合的视图(例如,列表到列表,地图到地图等),它似乎包含不同类型的元素(例如,整数而不是字符串)。

    通过应用转换从内部元素创建视图元素。 这是按需发生的,因此转换集合本身是无状态的。 作为一个适当的视图,内部集合以及转换视图的所有更改都将反映在另一个视图中(例如Map及其entrySet )。

    命名法

    转换集合也可以视为装饰器。 我将装饰后的集合称为内部集合,并将其泛型称为内部类型。 转换集合及其通用类型分别称为外部集合和外部类型。

    让我们来看一个例子。 假设我们有一组字符串,但是我们知道这些字符串只包含自然数。 我们可以使用一个转换集来获取一个看起来像是整数集的视图。

    (类似// "[0, 1] ~ [0, 1]"System.out.println(innerSet + " ~ " + transformingSet);System.out.println(innerSet + " ~ " + transformingSet);的控制台输出。)

    Set<String> innerSet = new HashSet<>();
    Set<Integer> transformingSet = new TransformingSet<>(
    	innerSet,
    	/* skipping some details */);
    // both sets are initially empty: "[] ~ []"
    
    // now let's add some elements to the inner set	
    innerSet.add("0");
    innerSet.add("1");
    innerSet.add("2");
    // these elements can be found in the view: "[0, 1, 2] ~ [0, 1, 2]"
    
    // modifying the view reflects on the inner set
    transformingSet.remove(1);
    // again, the mutation is visible in both sets: "[0, 2] ~ [0, 2]"

    看看转换有多愉快?

    细节

    像往常一样,魔鬼在细节中,所以让我们讨论这个抽象的重要部分。

    转寄

    转换集合是另一个集合的视图。 这意味着它们本身不保存任何元素,而是将所有调用转发给内部/装饰的集合。

    他们通过将调用参数从外部类型转换为内部类型并使用这些参数调用内部集合来实现此目的。 然后,将返回值从内部类型转换为外部类型。 对于以集合为参数的调用,这变得有些复杂,但是方法基本上是相同的。

    所有转换集合的实现方式都是将方法的每个调用转发到内部集合上的相同方法 (包括default方法 )。 这意味着内部集合对线程安全性,原子性等的任何保证也将由转换集合维护。

    转型

    转换是通过在构造过程中指定的一对函数来计算的。 一个用于将外部元素转换为内部元素,另一个用于另一个方向。 (对于映射,存在两对这样的对:一对用于键,一对用于值。)

    转换函数关于equals必须彼此相反,即, outer.equals(toOuter(toInner(outer))inner.equals(toInner(toOuter(inner))对于所有外部元素和内部元素必须为true。事实并非如此,这些集合的行为可能无法预测。

    对于身份而言,情况并非如此,即, outer == toOuter(toInner(outer))可能为false。 详细信息取决于所应用的转换,并且通常未指定-它可能永远不会,有时或永远是正确的。

    让我们看看转换函数如何查找我们的字符串和整数集:

    private Integer stringToInteger(String string) {
    	return Integer.parseInt(string);
    }
    
    private String integerToString(Integer integer) {
    	return integer.toString();
    }

    这就是我们使用它们创建转换集的方式:

    Set<Integer> transformingSet = new TransformingSet<>(
    	innerSet,
    	this::stringToInteger, this::integerToString,
    	/* still skipping some details */);

    直截了当吧?

    是的,但是即使这个简单的示例也包含陷阱。 注意前导零的字符串如何映射到相同的整数。 这可以用于创建不良行为:

    innerSet.add("010");
    innerSet.add("10");
    // now the transforming sets contains the same entry twice:
    // "[010, 10] ~ [10, 10]"
    
    // sizes of different sets:
    System.out.println(innerSet.size()); // "2"
    System.out.println(transformingSet.size()); // "2"
    System.out.println(new HashSet<>(transformingSet).size()); // "1" !
    
    // removing is also problematic
    transformingSet.remove(10) // the call returns true
    // one of the elements could be removed: "[010] ~ [10]"
    transformingSet.remove(10) // the call returns false
    // indeed, nothing changed: "[010] ~ [10]"
    
    // now things are crazy - this returns false:
    transformingSet.contains(transformingSet.iterator().next())
    // the transforming set does not contain its own elements ~> WAT?

    因此,在使用转换集合时,仔细考虑转换非常重要。 它们必须彼此相反!

    但这仅限于实际发生的内部和外部元素就足够了。 在示例中,问题仅在引入带有前导零的字符串时开始。 如果某些业务规则禁止了这些规则,并且这些规则已经正确执行,那么一切都会好起来的。

    类型安全

    以通常的静态,编译时方式对转换集合进行的所有操作都是类型安全的。 但是,由于collection接口中的许多方法都允许对象(例如Collection.contains(Object) )或未知通用类型的集合(例如Collection.addAll(Collection<?>) )作为参数,因此这并不涵盖所有可能发生在以下情况的情况运行。

    请注意,这些调用的参数必须从外部类型转换为内部类型,才能将调用转发到内部集合。 如果使用非外部类型的实例调用它们,则很可能无法将其传递给转换函数。 在这种情况下,该方法可能会抛出ClassCastException 尽管这与方法的合同一致,但可能仍然是意外的。

    为了降低这种风险,转换集合的构造函数需要使用内部和外部类型的令牌。 它们用于检查元素是否为必需类型,如果不是,则可以毫无例外地优雅地回答查询。

    我们终于可以确切地看到如何创建转换集:

    Set<Integer> transformingSet = new TransformingSet<>(
    		innerSet,
    		String.class, this::stringToInteger,
    		Integer.class, this::integerToString);

    构造函数实际上接受Class<? super I> Class<? super I>所以这也将编译:

    Set<Integer> transformingSetWithoutTokens = new TransformingSet<>(
    		innerSet,
    		Object.class, this::stringToInteger,
    		Object.class, this::integerToString);

    但是由于一切都是对象,因此对令牌的类型检查变得无用,并且调用转换函数可能会导致异常:

    Object o = new Object();
    innerSet.contains(o); // false
    transformingSet.contains(o); // false
    transformingSetWithoutTokens.contains(o); // exception

    用例

    我要说的是,转换集合是一种非常专业的工具,不太可能经常使用,但在每个分类良好的工具箱中仍然占有一席之地。

    重要的是要注意,如果性能至关重要,则可能会出现问题。 每次调用包含或返回元素的转换集合,都会导致至少创建一个(通常是多个)对象。 这些对垃圾收集器施加了压力,并导致通往有效负载的方式的间接级别更高。 (与以往一样,在讨论性能时:首先介绍个人资料!)

    那么转换集合的用例是什么? 上面我们已经看到了如何将集合的元素类型更改为另一种。 虽然这代表了总体思路,但我认为这不是一个非常普遍的用例(尽管在某些边缘情况下是有效的方法)。

    在这里,我将展示两个更狭窄的解决方案,您可能希望在某些时候使用它们。 但是我也希望这能使您了解如何使用转换集合来解决棘手的情况。 也许您的问题的解决方案在于巧妙地应用此概念。

    用Equals和HashCode代替

    我一直很喜欢.NET的哈希图(他们称其为字典)如何具有将EqualityComparer作为参数的构造函数 通常将在键上调用的所有equalshashCode调用均委派给该实例。 因此有可能即时替换有问题的实现。

    当您处理无法完全控制的有问题的旧版代码或库代码时,这可以节省生命。 当需要一些特殊的比较机制时,它也很有用。

    通过转换集合,这很容易。 为了使它更加容易,LibFX已经包含一个EqualityTransformingSetEqualityTransformingMap 它们修饰另一个集合或映射的实现,并且可以在构造过程中提供键/元素的equalshashCode函数。

    假设您想将字符串用作set元素,但为了进行比较,您仅对它们的长度感兴趣。

    Set<String> lengthSet = EqualityTransformingSet
    	.withElementType(String.class)
    	.withInnerSet(new HashSet<Object>())
    	.withEquals((a, b) -> a.length != b.length)
    	.withHash(String::length)
    	.build();
    
    lengthSet.add("a");
    lengthSet.add("b");
    System.out.println(lengthSet); // "[a]"

    从集合中删除可选性

    也许您正在与一个想到在各处使用Optional的想法的人一起工作,然后疯狂地使用它,现在您有了Set<Optional<String>> 如果无法修改代码(或您的同事),则可以使用转换集合来获取一个对您隐藏Optional的视图。

    同样,实现起来很简单,因此LibFX已经以OptionalTransforming[Collection|List|Set]的形式包含了它。

    Set<Optional<String>> innerSet = new HashSet<>();
    Set<String> transformingSet =
    	new OptionalTransformingSet<String>(innerSet, String.class);
    
    innerSet.add(Optional.empty());
    innerSet.add(Optional.of("A"));
    
    // "[Optional.empty, Optional[A]] ~ [null, A]"

    请注意, null表示空的optional的方式。 这是默认行为,但是您也可以将另一个字符串指定为空可选值的值:

    Set<String> transformingSet =
    	new OptionalTransformingSet<String>(innerSet, String.class, "DEFAULT");
    
    // ... code as above ...
    // "[Optional.empty, Optional[A]] ~ [DEFAULT, A]"

    这样可以避免Optional以及null作为元素,但是现在您必须确保永远不会有包含DEFAULT的Optional。 (如果确实如此,则隐式转换不是彼此相反的,这在上面已经看到导致问题了。)

    有关此示例的更多详细信息,请查看演示

    反射

    我们已经介绍过,转换集合是另一个集合的视图。 使用类型标记(以最大程度地减少ClassCastExceptions )和一对转换函数(它们必须彼此相反),每个调用都将转发到装饰的集合。 转换后的集合可以维护修饰后的集合所做的关于线程安全性,原子性的所有保证。

    然后,我们看到了转换集合的两个特定用例:替换等于和哈希数据结构使用的哈希码,以及从Collection<Optional<E>>删除可选性。

    谈谈LibFX

    就像我说的那样,转换集合是我的开源项目LibFX的一部分。 如果您考虑使用它,我想指出一些事情:

    • 这篇文章介绍了这个想法和一些细节,但是并不能代替文档。 查看Wiki,获取最新描述和指向Javadoc的指针。
    • 我认真对待测试。 多亏了Guava ,约6.500个单元测试涵盖了转换集合。
    • LibFX是根据GPL许可的。 如果那不适合您的许可模式,请随时与我联系。

    翻译自: https://www.javacodegeeks.com/2015/05/transforming-collections.html

    sci检索没有馆藏号

    展开全文
  • 大学文献检索资料 DOC

    2009-11-28 10:35:24
    信息检索语言是用来描述文献特征表达信息提问,沟通信息存储人员信息检索者双方思想的一种人工语言。 信息检索语言的分类:按描述文献特征划分; • 描述文献外部特征的检索语言:书名、刊名、篇名等著者名。...
  • 1) 按载体的出版编辑特点:分有十二大文献类型(及各自特点适用课题) 按信息载体的出版编辑特点划分 图书:是对科研成果、生产技术经验的总结性的概况论述 内容特点:系统性好、完整性好;出版周期较长,报道...
  • 要求 查找文件夹里某个日期区间内的word文档,全部word的名称路径列出来,比如 7月5到7月31 D盘下的所有word文档。 修改文件类型 修改文件路径 检索文件修改时间区间 #conding=utf8 import os import ...

    需求

    要求 查找文件夹里某个日期区间内的word文档,全部word的名称和路径列出来,比如 7月5号到7月31号 D盘下的所有word文档。

    修改文件类型

    在这里插入图片描述

    修改文件路径

    在这里插入图片描述

    检索文件修改时间区间

    在这里插入图片描述

    #conding=utf8  
    import os 
    import time
    g = os.walk(r"F:\学习资料\week_home")
    def judge_time_file(path, file, update_time):
        if not file.endswith(('.doc','.docx')):
            return False
        start_time = time.mktime(time.strptime('2020-04-12 00:00:00', "%Y-%m-%d %H:%M:%S"))
        end_time   = time.mktime(time.strptime('2020-05-23 00:00:00', "%Y-%m-%d %H:%M:%S"))
        # print(start_time ,  update_time , end_time)
        if start_time < update_time < end_time:
            return True
        return False
    
    data_list = []
    
    for path, dir_list, file_list in g:
        for file_name in file_list:
            local_time = os.stat(os.path.join(path, file_name)).st_mtime
            if judge_time_file(path, file_name, local_time):
                data_list.append([os.path.join(path, file_name), time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(local_time))])
    data_list.sort(key=lambda x:x[1])
    print(*data_list, sep='\n')
    
    
    展开全文
  • 请问,CPCI检索是针对哪种文献类型? 中科院文献情报中心,对JCR期刊按其影响因子引用率,分类几个区? 二 判断题 一般来说,我们把SCI、EI、ISTP称为,三大科技文献检索系统。(√) 一篇被CSCD数据库...

    一 单项选择题

    1. 请问,CPCI检索是针对哪种文献类型?

    在这里插入图片描述

    1. 中科院文献情报中心,对JCR期刊按其影响因子和引用率,分类几个区?

    在这里插入图片描述

    二 判断题

    1. 一般来说,我们把SCI、EI、ISTP称为,三大科技文献检索系统。(√)

    2. 一篇被CSCD数据库收入的文献,会有一个CSCD开头的入藏号。(√)

    三 填空题

    1. 引文检索除了实现信息评价外,还能达到【信息检索
      】的目的。
    展开全文
  • 要求 查找文件夹里某个日期区间内的word文档,全部word的名称路径列出来,比如 7月5到7月31 D盘下的所有word文档。 修改文件类型 修改文件路径 检索文件修改时间区间 #conding=utf8 import os import time...
  • 我们在customer这个索引下external这个类型下查询1文档 注意这里用get请求, 然后可以看到返回的数据 这里_version是2,说明这个文档被更新过 你好 _seq_no_primary_term是用来做乐观锁用的,只要我们的数据有...

    然后我们通过get请求来查询文档数据.

    可以看到这里

    http://192.168.56.10:9200/customer/external/1

    我们在customer这个索引下external这个类型下查询1号文档

    注意这里用get请求,

    然后可以看到返回的数据

    这里_version是2,说明这个文档被更新过

    你好

    _seq_no和_primary_term是用来做乐观锁用的,只要我们的数据有改动这里的

    _seq_no就会累加,只要我们的分片信息发生变化,比如服务器重启,

    主分片重新选举发生变化,这个_primary_term就会发生变化.

     

    然后

    _found:true 就是说找到了这条数据,

    然后

    _source 这个是找到的内容,可以看到内容列出了.

    然后我们再来看一下这个

    _seq_no:这个是用来做并发控制的,用来做乐观锁的,以前版本的es,用的是_version做并发控制,新的版本的都用

    _seq_no来做并发控制了.

     

    比如来了两个A,B都想修改数据,那么A自己保存的版本是1,那么他请求到的数据一看版本号也是1,代表别人没有修改过,然后

    A就可以去修改这个数据了.

     

    然后

    B要是来了一看,他也想修改这个数据,但是,他来了看的时候,一看_seq_no,是2,而自己保存的是1,这个时候表示数据,被别人修改过了

    那么B 就不再去修改这个数据,他要想修改应该是,先获取2版本的数据,然后在2版本基础上去修改,然后再去提交.

     

    我们可以演示一下:

    首先我们先看看,当前的这个_seq_no是1

    比如我们有A这个客户端,想把name改成1

    另一个客户端想把name改成2

    然后我们准备好以后,我看看,要想加上并发控制,需要在请求的地址后面,添加

    ?if_seq_no=0 & if_primary_term=1 类似这种字符串

    意思是我判断数据如果_seq_no是指定的值的话,我再去修改数据. 这里先不用去看if_primary_term=1,这个分片控制,后面再说.

    好,我们给A添加上

    http://192.168.56.10:9200/customer/external/1?if_seq_no=1&if_primary_term=1

    也就是说我去修改数据,但是修改以前我先判断一下es中的数据_seq_no是否是1,如果是1就修改,不是1就不修改

    然后B请求我们也添加上.

    现在我们先去A请求,点击send发送

    然后看到发送以后,result数据被修改了,然后_seq_no变成了11.增加了.

    这个时候B再去发送请求的时候

    他认为if_seq_no=1对吧,但是实际上现在_seq_no已经是11了,这个时候他想再去修改数据,就返回报错了

    说version conflict 说版本冲突.

    然后,如果B想去修改数据怎么办?他需要先查询到当前的_seq_no是多少,比如查询出来是11

     

     

    然后再去把自己的地址请求改成11

    http://192.168.56.10:9200/customer/external/1?if_seq_no=11&if_primary_term=1

    然后再去send可以看到,这个时候_seq_no变成12了就,表示修改成功了.

    同样这个时候,因为A请求,刚修改了数据,这个时候数据的_seq_no变成11了,他认为是11,但是

    实际上这个时候,_seq_no已经被B请求改成12了,所以这个时候他用11请求又报错了.

     

    他要是想去修改数据的话,他需要把这个_seq_no最新的12查询出来,然后用12再去修改数据

    这样就能修改成功了.

     

    技术交流QQ群【JAVA,C++,Python,.NET,BigData,AI】:170933152
    开通了个人技术微信公众号:credream,有需要的朋友可以添加相互学习

    展开全文
  • HarvestText是一个专注无(弱)监督方法,能够整合领域知识(如类型,别名)对特定领域文本进行简单高效地处理分析的库。适用于许多文本预处理初步探索性分析任务,在小说上分析,网络文本,专业文献等领域都有...
  • 指定Bean类型和事务管理机制 126 设置消息驱动Bean的特有属性 126 六.用deploytool配置JMS客户端 127 配置资源引用 127 配置资源环境引用 128 设置JNDI名 128 第8章 EJB查询语言 129 一.术语 129 二.简单语法 130...
  • 在 customer 索引下的 external 类型下保存 1 数据为 PUT customer/external/1 { “name”:“lohn Doe”} PUT POST 都可以;POST 新增。如果不指定id,会自动生成 id。指定 id 就会修改这个数据,并...
  • 一个基于以太坊IPFS的去中心化交易平台资讯平台 1总览 本平台拥有虚拟商品发布,购买...我的资讯(发布的资讯已经评价过的资讯,关键字检索类型检索) 资讯排序(评分时间榜) 2运行前准备 2.1安装IPFS 下载i
  • 数据库中的链接类型

    2013-11-18 09:55:49
    内连接。(典型的连接运算,使用像 = 或 之类的比较运算符)。包括相等连接自然连接。...例如,检索 students courses 表中学生标识相同的所有行。 外连接。外连接可以是左向外连接...
  • SQL Server表的连接类型

    2018-01-28 16:45:48
    例如,检索 studentscourses表中学生标识相同的所有行。 2、外联接。外联接可以是左向外联接、右向外联接或完整外部联接。 在 FROM子句中指定外联接时,可以由下列几组关键字中的一组指定: ...
  • 忍者帐户可以快速,自动无缝订阅各种类型的网站。它处理生成各种信息(名字,姓氏,地址...),一个密码一个临时的电子邮件地址(以检索邮件确认订阅)。 使用应用程序订阅网站后,该帐户将保存在本地存储中,...
  • 2,出现这种情况,大多都是因为工程导入了另一个工程,包括pods的使用,Xcode在打包的时候,检索到不同的工程,archive出错 3,解决: A,主工程project:在build setting里搜索install,设置:installtion ...
  • 在MySQL中,char、varchartext类型的字段都可以用来存储字符类型的数据,char、varchar都可以指定最大的字符长度,但text不可以。CHAR是一种固定长度的类型,适合用...它们的存储方式数据的检索方式也都不一样。 ...
  • 9月21作业总结

    2016-09-23 00:05:06
    集合也是一种对象,用于储存、检索、操作传输对象。 特点是元素类型可以不同、集合长度可变、空间不固定。 第二题: 集合框架提供了用于管理集合的接口类。 特点: List 线性...
  • 二、处理模板图片:将其分割成为单个数字的图片,所对应的数字相匹配存储可迭代的数据类型中。 读入模板图片,并对模板图片进行灰度化,最后转换为二值图像 计算模板的轮廓,给轮廓排序(按照在银行卡上的位置)...
  • 400电话办理选系统

    2012-05-09 17:03:41
    此功能根据大多数客户选心理,实现可根据地区电话区号检索400电话号码的功能,比如:上海的客户大多会选择:400 021 ABCD,客户只需要点击“地区名称”为“上海”的链接,就可以查询出所有包含“021”的号码。...
  • HiveYDB的sql语句

    2016-11-07 09:49:31
    YDB的数据类型 | YDB类型 | Hive类型 | 注解 | | :------- | --------:| :--: | ...String | 用于对号码类型的模糊检索 | | tint | int | 整形32位| | tlong | bigint | 整形64位
  • 例如,检索 studentscourses表中学生标识相同的所有行。 外连接 外联接可以是左向外联接、右向外联接或完整外部联接。 在 FROM子句中指定外联接时,可以由下列几组关键字中的一组指定: 1)LEFT JOIN或LEFT ...
  • 练习文件查看及检索操作 1, 查看/etc/filesystems文件,确认当前系统支持的文件系统类型 cat命令—显示并连接(Concatenate)文件的内容 2, 分页查看/etc/services文件,了解各种服务默认使用的协议、端口 more...
  • 为MySQLphpMyAdmin编写的脚本可在Apache类型的主机/服务器上运行。 随附简易安装说明。 您的个人公司品牌有很多自定义选项。 包括联系人,供应商客户目录。 客户可以用来保存您的项目记录,也可以用于库存控制...
  • (5)系统设置(主要是不同类型证件的可借书的总量借书时间等) (6)统计资料(包括惜出数量与库存数量的比例,各类图书数量与总数量的比例,热门图书统计数据等各种信息资料的统计); (7)帮助信息(包括对...
  • PHPMySQL Web开发第4版

    热门讨论 2014-08-13 15:32:15
    2.2 存储和检索Bob的订单 2.3 文件处理 2.4 打开文件 2.4.1 选择文件模式 2.4.2 使用fopen()打开文件 2.4.3 通过FTP或HTTP打开文件 2.4.4 解决打开文件时可能遇到的问题 2.5 写文件 2.5.1 fwrite()的参数 ...
  • 集合可以对数据进行存储,检索,操作; 它们可以把许多个体组织成一个整体: 比如一副扑克牌(许多牌组成的集合); 比如一个电话本(许多姓名号码的映射)。 什么是集合框架? 集合框架是一个代表、操作...
  • 2.2 存储和检索Bob的订单 2.3 文件处理 2.4 打开文件 2.4.1 选择文件模式 2.4.2 使用fopen()打开文件 2.4.3 通过FTP或HTTP打开文件 2.4.4 解决打开文件时可能遇到的问题 2.5 写文件 2.5.1 fwrite()的参数 ...
  • 机房收费系统——上下机

    千次阅读 多人点赞 2013-11-05 14:54:24
    上个月准备考试,机房收费系统就停了,考试完了任务还得继续。...卡号的其他相关信息要从学生信息表中检索出来显示在对应的文本框中,上机日期时间为当前系统日期时间。然后给正在上机的表中添加一条记录,把
  • Hibernate模糊查询

    万次阅读 2012-12-17 11:32:33
    %(百分):匹配任意类型、任意长度的字符串,中文则需要两个百分"%%" _(下划线):匹配单个任意字符,一般用来限制字符串表达式的长度。 下面举例说明: 1.检索姓名以"M"开头的同学:   String queryString=

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 387
精华内容 154
关键字:

检索类型和检索号