Java中如何从Set中有序获取数据?因getAllResults()返回Set无法用SortedSet
从无序Set中按有序方式获取数据的解决方案
你需要从Set<ITestResult>中按有序方式遍历数据,但getAllResults()返回的是普通无序Set,无法直接使用SortedSet,这里提供两种可行的处理方案:
方案1:转换为List后排序
先把Set转换成List,再根据需求自定义排序规则:
Set<ITestResult> failedTestResults = con.getTestContext().getFailedTests().getAllResults(); // 将Set转换为List List<ITestResult> sortedFailedResults = new ArrayList<>(failedTestResults); // 按测试方法名升序排序,可根据需求修改规则 Collections.sort(sortedFailedResults, new Comparator<ITestResult>() { @Override public int compare(ITestResult o1, ITestResult o2) { return o1.getName().compareTo(o2.getName()); } }); // 遍历排序后的集合 for (ITestResult failedTestResult : sortedFailedResults) { Object[] failedTestParameters = failedTestResult.getParameters(); String failedMethodName = failedTestResult.getName(); Throwable exception = failedTestResult.getThrowable(); list.add("Failed TestName :" + failedMethodName); }
如果使用Java 8及以上版本,排序逻辑可以用Lambda表达式简化:
// 简化写法1 Collections.sort(sortedFailedResults, (o1, o2) -> o1.getName().compareTo(o2.getName())); // 简化写法2 sortedFailedResults.sort(Comparator.comparing(ITestResult::getName));
方案2:转换为TreeSet实现有序遍历
如果ITestResult支持比较(实现Comparable接口或提供自定义比较器),可以直接将原Set转换为TreeSet(SortedSet的实现类):
Set<ITestResult> failedTestResults = con.getTestContext().getFailedTests().getAllResults(); // 通过自定义比较器创建有序的TreeSet Set<ITestResult> sortedSet = new TreeSet<>(Comparator.comparing(ITestResult::getName)); sortedSet.addAll(failedTestResults); // 遍历有序集合 for (ITestResult failedTestResult : sortedSet) { Object[] failedTestParameters = failedTestResult.getParameters(); String failedMethodName = failedTestResult.getName(); Throwable exception = failedTestResult.getThrowable(); list.add("Failed TestName :" + failedMethodName); }
关键注意点
- 排序规则可按需调整:比如按测试执行时间排序,可使用
ITestResult.getStartMillis()作为比较依据 - 若
getName()可能返回null,需在比较器中添加null值处理逻辑,避免空指针异常
内容的提问来源于stack exchange,提问作者Rohit Mahajan
相关产品推荐
相关产品推荐

