添加列表元素存储方法

This commit is contained in:
彭宇琦 2020-12-20 03:53:21 +08:00
parent ce46aeaab9
commit 798578ae0e
5 changed files with 420 additions and 37 deletions

47
pom.xml
View File

@ -3,7 +3,7 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>pres.pyq</groupId>
<groupId>pres.autest</groupId>
<artifactId>autest</artifactId>
<version>2.0.0-debug</version>
<packaging>jar</packaging>
@ -181,6 +181,51 @@
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-gpg-plugin</artifactId>
<version>1.6</version>
<executions>
<execution>
<id>sign-artifacts</id>
<phase>verify</phase>
<goals>
<goal>sign</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.sonatype.plugins</groupId>
<artifactId>nexus-staging-maven-plugin</artifactId>
<version>1.6.7</version>
<extensions>true</extensions>
<configuration>
<serverId>ossrh</serverId>
<nexusUrl>https://oss.sonatype.org/</nexusUrl>
<autoReleaseAfterClose>false</autoReleaseAfterClose>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.4</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-clean-plugin</artifactId>
<version>2.5</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.5.1</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.7</version>
</plugin>
</plugins>
</build>
</project>

View File

@ -0,0 +1,26 @@
package pres.auxiliary.tool.data;
public class IllegalDataException extends RuntimeException {
private static final long serialVersionUID = 1L;
public IllegalDataException() {
}
public IllegalDataException(String arg0) {
super(arg0);
}
public IllegalDataException(Throwable arg0) {
super(arg0);
}
public IllegalDataException(String arg0, Throwable arg1) {
super(arg0, arg1);
}
public IllegalDataException(String arg0, Throwable arg1, boolean arg2, boolean arg3) {
super(arg0, arg1, arg2, arg3);
}
}

View File

@ -1,26 +0,0 @@
package pres.auxiliary.tool.data;
public class IllegalStringLengthException extends RuntimeException {
private static final long serialVersionUID = 1L;
public IllegalStringLengthException() {
}
public IllegalStringLengthException(String arg0) {
super(arg0);
}
public IllegalStringLengthException(Throwable arg0) {
super(arg0);
}
public IllegalStringLengthException(String arg0, Throwable arg1) {
super(arg0, arg1);
}
public IllegalStringLengthException(String arg0, Throwable arg1, boolean arg2, boolean arg3) {
super(arg0, arg1, arg2, arg3);
}
}

View File

@ -392,10 +392,10 @@ public class RandomString {
* @return 生成的6个字符长度的字符串
* @see #toString(int)
* @see #toString(int, int)
* @throws IllegalStringLengthException 产生字符串不允许重复且字符串产生范围长度小于6位处理方式为抛出异常时抛出
* @throws IllegalDataException 产生字符串不允许重复且字符串产生范围长度小于6位处理方式为抛出异常时抛出
*/
@Override
public String toString() throws IllegalStringLengthException {
public String toString() throws IllegalDataException {
// 判断随机字符串生成范围是否为空为空则直接返回空字符串
if (stringSeed.length() == 0) {
return "";
@ -414,9 +414,9 @@ public class RandomString {
* @return 返回生成的随机字符串
* @see #toString()
* @see #toString(int)
* @throws IllegalStringLengthException 产生字符串不允许重复且传入的参数大于字符串产生范围长度处理方式为抛出异常时抛出
* @throws IllegalDataException 产生字符串不允许重复且传入的参数大于字符串产生范围长度处理方式为抛出异常时抛出
*/
public String toString(int stringLengthMin, int stringLengthMax) throws IllegalStringLengthException {
public String toString(int stringLengthMin, int stringLengthMax) throws IllegalDataException {
// 判断随机字符串生成范围是否为空为空则直接返回空字符串
if (stringSeed.length() == 0) {
return "";
@ -433,7 +433,7 @@ public class RandomString {
}
if ( isRepeat() && stringLengthMax > stringSeed.length() && dispose == DISPOSE_THROW_EXCEPTION ) {
throw new IllegalStringLengthException("最大生成长度大于字符串产生范围的长度");
throw new IllegalDataException("最大生成长度大于字符串产生范围的长度");
}
return generateString(new Random().nextInt((stringLengthMax - stringLengthMin + 1)) + stringLengthMin); // 返回生成的字符串
@ -447,9 +447,9 @@ public class RandomString {
* @return 返回生成的随机字符串
* @see #toString()
* @see #toString(int, int)
* @throws IllegalStringLengthException 产生字符串不允许重复且传入的参数大于字符串产生范围长度处理方式为抛出异常时抛出
* @throws IllegalDataException 产生字符串不允许重复且传入的参数大于字符串产生范围长度处理方式为抛出异常时抛出
*/
public String toString(int stringLength) throws IllegalStringLengthException {
public String toString(int stringLength) throws IllegalDataException {
// 判断随机字符串生成范围是否为空为空则直接返回空字符串
if (stringSeed.length() == 0) {
return "";
@ -494,12 +494,12 @@ public class RandomString {
* @see #toString()
* @see #toString(int)
* @see #toString(int, int)
* @throws IllegalStringLengthException 产生字符串不允许重复且传入的参数大于字符串产生范围长度处理方式为抛出异常时抛出
* @throws IllegalDataException 产生字符串不允许重复且传入的参数大于字符串产生范围长度处理方式为抛出异常时抛出
*/
private String generateString(int stringLength) throws IllegalStringLengthException {
private String generateString(int stringLength) throws IllegalDataException {
// 判断字符串字符是否允许重复不允许重复时其处理方式是否为抛异常为抛异常时其stringLength是否大于字符串产生范围的长度若是则直接抛出异常
if (!isRepeat() && dispose == DISPOSE_THROW_EXCEPTION && stringLength > stringSeed.length()) {
throw new IllegalStringLengthException("需要生成的随机字符串长度大于字符串产生范围的最大长度");
throw new IllegalDataException("需要生成的随机字符串长度大于字符串产生范围的最大长度");
}
String RandomString = ""; // 定义一个字符串变量用于存储选择的字符串

View File

@ -0,0 +1,338 @@
package pres.auxiliary.tool.data;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import pres.auxiliary.work.selenium.element.DataListBy;
/**
* <p>
* <b>文件名</b>TableData.java
* </p>
* <p>
* <b>用途</b> 提供对列表型数据进行处理的方法添加列元素时可设置是否检查数据量的一致性若打开该设置
* 在返回元素时当存在列元素数据个数与其他列不一致时则会抛出一个异常
* </p>
* <p>
* <b>编码时间</b>2020年12月17日上午8:24:47
* </p>
* <p>
* <b>修改时间</b>2020年12月17日上午8:24:47
* </p>
*
* @author 彭宇琦
* @version Ver1.0
* @since JDK 1.8
* @param <T> 列元素的元素类型
*
*/
public class TableData<T> {
/**
* 存储列表元素数据
*/
protected LinkedHashMap<String, ArrayList<Optional<T>>> tableMap = new LinkedHashMap<>(16);
/**
* 指向列表中最短列数据个数
*/
protected int minLength = Integer.MAX_VALUE;
/**
* 指向列表中最长列数据个数
*/
protected int maxLength = -1;
/**
* 定义添加列时是否严格检查的开关
*/
private boolean isExamine = true;
/**
* 构造对象
*/
public TableData() {
}
/**
* 构造对象并初始化列表的数据
*
* @param tableMap 列表数据
*/
public TableData(Map<String, ArrayList<T>> tableMap) {
tableMap.forEach(this::add);
}
/**
* 用于设置是否对传入的元素列表的个数进行严格校验即在调用{@link #addList(DataListBy)}方法时
* 若元素个数与初次传入的个数不符且需要严格校验则抛出异常反之则直接进行存储
*
* @param isExamine 是否严格校验元素个数
*/
public void setExamine(boolean isExamine) {
this.isExamine = isExamine;
}
/**
* 用于根据列表名称存储一列元素数据多次调用该方法时将在相应列后继续添加数据
*
* @param columnName 列表名称
* @param columnDataList 数据集合
* @return 类本身
* @throws IllegalDataException 传入元素集合为null时抛出的异常
*/
public TableData<T> add(String columnName, List<T> columnDataList) {
// 判断列表名称是否正确传入
columnName = Optional.ofNullable(columnName).filter(text -> !text.isEmpty())
.orElseThrow(() -> new IllegalDataException("必须指定列名称"));
// 判断列表名称是否未存储未存储则添加相应的集合
if (!tableMap.containsKey(columnName)) {
tableMap.put(columnName, new ArrayList<Optional<T>>());
}
// 扫描数据将数据添加至tableMap中
tableMap.get(columnName)
.addAll(Optional.ofNullable(columnDataList).orElseThrow(() -> new IllegalDataException("元素集合不能为null"))
.stream().map(Optional::ofNullable).collect(Collectors.toList()));
// 计算最长/最短列元素个数
refreshLength();
return this;
}
/**
* 用于根据列表名称存储一组元素数据多次调用该方法时将在相应列后继续添加数据
*
* @param columnName 列表名称
* @param columnDatas 数据集合
* @return 类本身
*/
@SuppressWarnings("unchecked")
public TableData<T> add(String columnName, T... columnDatas) {
return add(columnName, Optional.ofNullable(columnDatas).map(Arrays::asList).orElse(new ArrayList<T>()));
}
/**
* 返回指定列的数据个数
*
* @param columnName 列名称
* @return 数据个数
*/
public int getListSize(String columnName) {
return getColumnList(columnName).size();
}
/**
* 返回列表中最长列的数据个数
*
* @return 数据个数
*/
public int getLongListSize() {
return maxLength;
}
/**
* 返回列表中最短列的数据个数
*
* @return 数据个数
*/
public int getShortListSize() {
return minLength;
}
/**
* 用于返回列名称
*
* @return 列名称
*/
public ArrayList<String> getColumnName() {
ArrayList<String> columnNameList = new ArrayList<>();
tableMap.forEach((key, value) -> columnNameList.add(key));
return columnNameList;
}
/**
* 用于清空指定列的数据集合但不删除该列
*
* @param columnName 列名称
* @return 被清空的列数据集合
* @throws IllegalDataException 列名称不存在或未传入时抛出的异常
*/
public ArrayList<Optional<T>> clearColumn(String columnName) {
// 存储待清空的集合
ArrayList<Optional<T>> columnDataList = getColumnList(columnName);
// 清空列指向的集合
tableMap.get(columnName).clear();
// 刷新列表最长/最短列数据个数
refreshLength();
return columnDataList;
}
/**
* 用于移除指定列的数据集合
*
* @param columnName 列名称
* @return 被移除的列数据集合
* @throws IllegalDataException 列名称不存在或未传入时抛出的异常
*/
public ArrayList<Optional<T>> remove(String columnName) {
// 存储待清空的集合
ArrayList<Optional<T>> columnDataList = getColumnList(columnName);
// 清空列指向的集合
tableMap.remove(columnName);
// 刷新列表最长/最短列数据个数
refreshLength();
return columnDataList;
}
/**
* 用于返回指定列的所有数据
*
* @param columnName 列名称
* @return 指定列的所有数据
*/
public ArrayList<Optional<T>> getColumnList(String columnName) {
columnName = Optional.ofNullable(columnName).filter(tableMap::containsKey)
.orElseThrow(() -> new IllegalDataException("不存在的元素列"));
ArrayList<Optional<T>> columnDataList = new ArrayList<>();
columnDataList.addAll(tableMap.get(columnName));
return columnDataList;
}
/**
* 用于获取指定列与指定列的数据并以传入的字段顺序将获取到的每列数据进行存储
* <p>
* 方法接收数据的起始下标与结束下标并根据该组下标获取结果将其转换为
* 字符串的形式进行返回另外行下标从1开始遍历下标传入0或者1都表示获取第1行元素且下标允许传入负数 表示反序遍历其可能会出现以下情况
* <ol>
* <li>起始下标大于数据总数返回空集合</li>
* <li>起始下标大于结束下标只获取起始行的数据</li>
* <li>起始下标等于结束下标获取当前行的数据</li>
* <li>起始下标小于结束下标获取相应多行的数据</li>
* </ol>
* </p>
* <p>
* <b>注意</b>调用方法后下标传入的负数实则会根据数据的个数转换为一个正数
* 进行传参即假设数据中有100个元素下标传入-2时会将其转换为99倒数第二行进行处理
* 若负数下标的绝对值超过数据的总数则表示获取第一行元素另外获取数据的数据采用包含两边的形式
* 存储数据及传入起始下标为2结束下标为4时表示获取指定列2-4行的数据
* </p>
*
* @param startRowIndex 起始下标
* @param endRowIndex 结束下标
* @param columnNames 列名称组可传入多个值
* @return 按照字段顺序获取的列数据
* @throws IllegalDataException 需要严格检查且存在列数据不同时抛出的异常
*/
public LinkedHashMap<String, ArrayList<Optional<T>>> getData(int startRowIndex, int endRowIndex,
String... columnNames) {
return getData(startRowIndex, endRowIndex,
Arrays.stream(Optional.ofNullable(columnNames).orElseThrow(() -> new IllegalDataException("未传入数据列")))
.filter(tableMap::containsKey).collect(Collectors.toList()));
}
/**
* 用于获取指定列与指定列的数据并以传入的字段顺序将获取到的每列数据进行存储
* <p>
* 方法接收数据的起始下标与结束下标并根据该组下标获取结果将其转换为
* 字符串的形式进行返回另外行下标从1开始遍历下标传入0或者1都表示获取第1行元素且下标允许传入负数 表示反序遍历其可能会出现以下情况
* <ol>
* <li>起始下标大于数据总数返回空集合</li>
* <li>起始下标大于结束下标只获取起始行的数据</li>
* <li>起始下标等于结束下标获取当前行的数据</li>
* <li>起始下标小于结束下标获取相应多行的数据</li>
* </ol>
* </p>
* <p>
* <b>注意</b>调用方法后下标传入的负数实则会根据数据的个数转换为一个正数
* 进行传参即假设数据中有100个元素下标传入-2时会将其转换为99倒数第二行进行处理
* 若负数下标的绝对值超过数据的总数则表示获取第一行元素另外获取数据的数据采用包含两边的形式
* 存储数据及传入起始下标为2结束下标为4时表示获取指定列2-4行的数据
* </p>
*
* @param startRowIndex 起始下标
* @param endRowIndex 结束下标
* @param columnNames 列名称组可传入多个值
* @return 按照字段顺序获取的列数据
* @throws IllegalDataException 需要严格检查且存在列数据不同时抛出的异常
*/
public LinkedHashMap<String, ArrayList<Optional<T>>> getData(int startRowIndex, int endRowIndex,
List<String> columnNameList) {
// 若最长列数据与最短列数据不一致且需要严格判断则抛出异常
if (minLength != maxLength && isExamine) {
throw new IllegalDataException(String.format("数据列长度不一致,最长数据列长度:%d最短数据列长度%d", maxLength, minLength));
}
// 存储获取的集合
LinkedHashMap<String, ArrayList<Optional<T>>> columnDataMap = new LinkedHashMap<>(16);
Optional.ofNullable(columnNameList).orElseThrow(() -> new IllegalDataException("未传入数据列")).stream()
.filter(tableMap::containsKey).forEach(columnName -> {
// 获取转换后的下标其第一行元素的下标从1开始
int startIndex = changeIndex(startRowIndex, getListSize(columnName));
int endIndex = changeIndex(endRowIndex, getListSize(columnName));
ArrayList<Optional<T>> columnDataList = new ArrayList<>();
// 遍历列表存储数据若当前列无此行元素即抛出数组越界异常则存储空值
IntStream.range(startIndex, endIndex + 1).forEach(index -> {
try {
columnDataList.add(tableMap.get(columnName).get(index - 1));
} catch (IndexOutOfBoundsException e) {
columnDataList.add(Optional.empty());
}
});
columnDataMap.put(columnName, columnDataList);
});
return columnDataMap;
}
/**
* 刷新表中最长与最短列的元素个数用于清空或删除表时的计算
*/
private void refreshLength() {
minLength = Integer.MAX_VALUE;
maxLength = -1;
// 遍历所有列查询每一列数据个数
for (String name : tableMap.keySet()) {
int length = tableMap.get(name).size();
minLength = Math.min(length, minLength);
maxLength = Math.max(length, maxLength);
}
}
/**
* 用于将下标转换为正序遍历的下标
*
* @param index 传入的下标
* @param length 数据总数
* @return 转换后的下标
*/
private int changeIndex(int index, int length) {
// 若下标为0则直接返回1若下标小于0则对下标进行处理若下标大于0则直接返回下标
if (index < 0) {
// 若下标的绝对值大于数据总数则返回1
if (Math.abs(index) > length) {
return 1;
} else {
return (length + index) + 1;
}
} else if (index == 0) {
return 1;
} else {
return index;
}
}
}