【问题标题】:how to get last element of hasSet如何获取hashSet的最后一个元素
【发布时间】:2020-04-06 15:50:38
【问题描述】:

我想得到HashSet 的最后一个元素 所以TreeSet 中有一个last() 方法所以,我想将 set 转换为 TreeSet 并对其应用 last() 方法,以便我将获得最后一个元素

我试过下面的代码

           Set<EnrollmentStatusTrack> set= new HashSet<EnrollmentStatusTrack>();
            set=en.getEnrollmentStatusTracks();
            TreeSet<EnrollmentStatusTrack> hashSetToTreeSet  = new TreeSet<EnrollmentStatusTrack>(set);  //here is the exception
            EnrollmentStatusTrack entt=hashSetToTreeSet.last();

然后我得到以下异常

java.lang.ClassCastException: com.barcouncil.entity.EnrollmentStatusTrack cannot be cast to java.lang.Comparable
    at java.util.TreeMap.compare(TreeMap.java:1290)
    at java.util.TreeMap.put(TreeMap.java:538)
    at java.util.TreeSet.add(TreeSet.java:255)
    at java.util.AbstractCollection.addAll(AbstractCollection.java:344)
    at java.util.TreeSet.addAll(TreeSet.java:312)
    at java.util.TreeSet.<init>(TreeSet.java:160)
    at com.barcouncil.dao.EnrollmentDaoImpl.searchReport(EnrollmentDaoImpl.java:994)
    at com.barcouncil.service.EnrollmentServiceImpl.searchReport(EnrollmentServiceImpl.java:278)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:343)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:198)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:294)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:98)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212)
    at com.sun.proxy.$Proxy1909.searchReport(Unknown Source)
    at com.barcouncil.controller.EnrollmentController.searchReport(EnrollmentController.java:984)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:189)
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138)
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:102)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:800)
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1038)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:942)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1005)
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:908)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:648)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:882)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:292)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:320)
    at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:127)
    at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:91)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
    at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:119)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
    at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:137)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
    at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
    at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:170)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
    at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
    at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:200)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
    at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
    at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:74)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
    at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
    at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
    at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:215)
    at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:178)
    at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:357)
    at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:270)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:528)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1100)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:687)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1520)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1476)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:745)

谁能帮我解决这个问题? 还是有其他程序可以这样做?

【问题讨论】:

  • A HashSet 没有定义的“最后一个”元素。
  • 如果你想要一个 HashSet 的“最后一个”元素,只需抓住它的 any 元素,就像@chrylis-onstrike- 所说的一样。所以,这听起来更像是一个 XY 问题。你的意图的真正问题是什么?

标签: java collections set treeset


【解决方案1】:

com.barcouncil.entity.EnrollmentStatusTrack 不能转换为 java.lang.Comparable

这意味着您的EnrollmentStatusTrack 类没有实现Comparable 接口,因此您不能使用没有Comparator&lt;EnrollmentStatusTrack&gt; 参数的构造函数构造TreeSet&lt;EnrollmentStatusTrack&gt;(因为TreeSet 会无法比较添加到其中的元素)。

你可以写:

Comprator<EnrollmentStatusTrack> comparator = ...
TreeSet<EnrollmentStatusTrack> hashSetToTreeSet  = new TreeSet<>(comparator);
hashSetToTreeSet.addAll(set);

其中comparator 实现了比较逻辑。

【讨论】:

  • 谢谢你的回复@Eran 你能告诉我那是什么comparator=..... 我应该在那里做什么
  • @bharathvarma 它应该是实现Comparator&lt;EnrollmentStatusTrack&gt; 接口(具有int compare(EnrollmentStatusTrack o1,EnrollmentStatusTrack o2) 方法)的类的实例。应该如何比较两个EnrollmentStatusTrack 实例?
【解决方案2】:

您可以通过实现 Comparable 接口在您的EnrollmentStatusTrack 类中定义compareTo() 方法。 在compareTo()方法中,需要定义第一个/最后一个元素的含义,即填充TreeSet时元素的顺序。

class EnrollmentStatusTrack implements Comparable<EnrollmentStatusTrack> {

    int size;

    EnrollmentStatusTrack(int s) {
        size = s;
    }

    public int compareTo(EnrollmentStatusTrack o) {
        return size - o.size;
    }
}

【讨论】:

    【解决方案3】:

    我的目标是找到最后一个元素,所以我这样做了

    if(en.getEnrollmentStatusTracks() != null)
                {
                Set<EnrollmentStatusTrack> set= new HashSet<EnrollmentStatusTrack>();
                set=en.getEnrollmentStatusTracks();
                List<EnrollmentStatusTrack> list  = new ArrayList<EnrollmentStatusTrack>(set); 
                Collections.sort(list, Comparator.comparingInt(EnrollmentStatusTrack::getEnrollmentStatusTrackId)); 
                if(list.size() > 0)
                {
                 ent=list.get(list.size() - 1);
                }
    }
    

    【讨论】:

      【解决方案4】:

      很可能,您使用“最后一个”不是表示 EnrollmentStatusTrack 内部排序中的最后一个,而是 最后添加(因为条款注册状态轨迹)。

      在这种情况下,请使用 LinkedHashSet,它是按添加顺序排列的,例如 LinkedHashMap

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-04-02
        • 2014-04-27
        • 2010-10-30
        • 1970-01-01
        • 2022-06-28
        • 2022-11-15
        • 1970-01-01
        • 2010-11-30
        相关资源
        最近更新 更多