From 36e8457f6166ae5035be598d8d67d489062e9a2c Mon Sep 17 00:00:00 2001 From: fujie <405295521@qq.com> Date: Sat, 11 Nov 2017 15:12:56 +0800 Subject: [PATCH] =?UTF-8?q?1.=E4=BF=AE=E6=AD=A3=E6=8E=92=E5=BA=8F=E4=B8=8D?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E7=89=B9=E6=AE=8A=E5=AD=97=E7=AC=A6=E7=9A=84?= =?UTF-8?q?=E9=94=99=E8=AF=AF=E3=80=822.=E4=BF=AE=E6=94=B9=E9=BB=98?= =?UTF-8?q?=E8=AE=A4=E6=8E=92=E5=BA=8F=E4=B8=BAasc=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../test/resources/dataSetExample/sort.tsf | 8 + .../resources/dataSetExample/sortExample.txt | 6 + .../function/AbstractSortFunction.java | 201 ++++++++++-------- 3 files changed, 123 insertions(+), 92 deletions(-) create mode 100644 org.tinygroup.tinyscript/src/test/resources/dataSetExample/sort.tsf create mode 100644 org.tinygroup.tinyscript/src/test/resources/dataSetExample/sortExample.txt diff --git a/org.tinygroup.tinyscript/src/test/resources/dataSetExample/sort.tsf b/org.tinygroup.tinyscript/src/test/resources/dataSetExample/sort.tsf new file mode 100644 index 0000000..959d05c --- /dev/null +++ b/org.tinygroup.tinyscript/src/test/resources/dataSetExample/sort.tsf @@ -0,0 +1,8 @@ +dataSet = readTxt("/dataSetExample/sortExample.txt"); +println(dataSet.sort("w_eight desc")); +println(dataSet.sort("n-ame desc,w_eight desc,value asc")); +println(dataSet.sort((a,b)->{ + return a[0]>b[0]?1:a[0]==b[0]?0:-1; +})); +println([6,2,3].sort());//默认asc排序 +println([6,2,3].sort("desc")); \ No newline at end of file diff --git a/org.tinygroup.tinyscript/src/test/resources/dataSetExample/sortExample.txt b/org.tinygroup.tinyscript/src/test/resources/dataSetExample/sortExample.txt new file mode 100644 index 0000000..e79ced2 --- /dev/null +++ b/org.tinygroup.tinyscript/src/test/resources/dataSetExample/sortExample.txt @@ -0,0 +1,6 @@ +n-ame w_eight value count +a 2 6 1 +b 2 3 1 +c 6 5 1 +e 4 6 1 +d 5 4 1 diff --git a/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/AbstractSortFunction.java b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/AbstractSortFunction.java index 827aeb0..b0c23f5 100644 --- a/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/AbstractSortFunction.java +++ b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/AbstractSortFunction.java @@ -15,60 +15,64 @@ import org.tinygroup.tinyscript.interpret.anonymous.SingleMethodProcessor; /** * 排序入口函数 + * * @author yancheng11334 * */ -@SuppressWarnings({"rawtypes","unchecked"}) +@SuppressWarnings({ "rawtypes", "unchecked" }) public abstract class AbstractSortFunction extends AbstractScriptFunction { private static final Pattern ORDER_SIMPLE = Pattern.compile("\\s*(asc|desc)\\s*", Pattern.CASE_INSENSITIVE); - - private static final String SPACE = "\\s*"; - private static final String FIELD = "[_a-zA-Z\u4E00-\u9FA5]*"; - private static final String ORDER = "(asc|desc)?"; - private static final Pattern ORDER_FIELD = Pattern.compile(SPACE+FIELD+SPACE+ORDER+"("+SPACE+","+FIELD+SPACE+ORDER+")*", Pattern.CASE_INSENSITIVE); - + + private static final String SPACE = "\\s*"; + private static final String FIELD = ".+"; + private static final String ORDER = "(asc|desc)?"; + private static final Pattern ORDER_FIELD = Pattern.compile( + SPACE + FIELD + SPACE + ORDER + "(" + SPACE + "," + FIELD + SPACE + ORDER + ")*", Pattern.CASE_INSENSITIVE); + private Comparator asc = new SimpleTypeComparator(true); private Comparator desc = new SimpleTypeComparator(false); - protected static final String DEFAULT_CONTEXT_NAME = "_tiny_list_ele"; - + protected static final String DEFAULT_CONTEXT_NAME = "_tiny_list_ele"; + public String getNames() { return "sort"; } - - public Object execute(ScriptSegment segment, ScriptContext context, - Object... parameters) throws ScriptException { - if(parameters==null || parameters.length==0){ - throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.parameter.empty", getNames())); - }else if(checkParameters(parameters, 2)){ - try{ - if(parameters[1] instanceof String){ - return sort(segment,context,parameters[0],(String)parameters[1]); - }else if(parameters[1] instanceof LambdaFunction){ - //通过lambda表达式进行排序 + + public Object execute(ScriptSegment segment, ScriptContext context, Object... parameters) throws ScriptException { + if (parameters == null || parameters.length == 0) { + throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.parameter.empty", getNames())); + } else if (checkParameters(parameters, 1)) { + return sort(segment, context, parameters[0], "asc"); + } else if (checkParameters(parameters, 2)) { + try { + if (parameters[1] instanceof String) { + return sort(segment, context, parameters[0], (String) parameters[1]); + } else if (parameters[1] instanceof LambdaFunction) { + // 通过lambda表达式进行排序 LambdaFunction lambdaFunction = (LambdaFunction) parameters[1]; SingleMethodProcessor processor = ClassInstanceUtil.findSingleMethodProcessor(Comparator.class); Comparator c = (Comparator) processor.build(lambdaFunction, context); - return sortByLambda(parameters[0],c); + return sortByLambda(parameters[0], c); } - }catch(Exception e){ - throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.run.error", getNames()),e); + } catch (Exception e) { + throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.run.error", getNames()), e); } - + } - throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.parameter.error", getNames())); + throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.parameter.error", getNames())); } - - protected boolean matchSimpleRule(String rule){ + + protected boolean matchSimpleRule(String rule) { return ORDER_SIMPLE.matcher(rule).matches(); } - - protected boolean matchFieldRule(String rule){ + + protected boolean matchFieldRule(String rule) { return ORDER_FIELD.matcher(rule).matches(); } - + /** * 排序 + * * @param segment * @param context * @param obj @@ -76,75 +80,79 @@ public abstract class AbstractSortFunction extends AbstractScriptFunction { * @return * @throws ScriptException */ - protected abstract Object sort(ScriptSegment segment, ScriptContext context,Object obj,String rule) throws ScriptException; - + protected abstract Object sort(ScriptSegment segment, ScriptContext context, Object obj, String rule) + throws ScriptException; + /** * 获取比较器 + * * @param rule * @param segment * @param source * @return * @throws Exception */ - public Comparator getComparator(String rule,ScriptSegment segment,Object source) throws Exception{ - //匹配简单规则 - if(matchSimpleRule(rule)){ + public Comparator getComparator(String rule, ScriptSegment segment, Object source) throws Exception { + // 匹配简单规则 + if (matchSimpleRule(rule)) { String runRule = rule.toLowerCase(); - if(runRule.indexOf("asc")>-1){ - return asc; - }else{ - return desc; + if (runRule.indexOf("desc") > -1) { + return desc; + } else { + return asc; } } - //进行字段匹配 - return createComparator(rule,segment,source); + // 进行字段匹配 + return createComparator(rule, segment, source); } - + /** * 通过lambda函数进行排序 + * * @param sortObject * @param c * @return * @throws Exception */ - protected abstract Object sortByLambda(Object sortObject,Comparator c) throws Exception; - + protected abstract Object sortByLambda(Object sortObject, Comparator c) throws Exception; + /** * 创建比较器 + * * @param rule * @param segment * @param source * @return * @throws Exception */ - protected abstract Comparator createComparator(String rule,ScriptSegment segment,Object source) throws Exception; - + protected abstract Comparator createComparator(String rule, ScriptSegment segment, Object source) throws Exception; + @SuppressWarnings("hiding") - class SimpleTypeComparator implements Comparator{ + class SimpleTypeComparator implements Comparator { private boolean asc; - - public SimpleTypeComparator(boolean ascTag){ + + public SimpleTypeComparator(boolean ascTag) { this.asc = ascTag; } - + public int compare(Object o2, Object o1) { - if(asc){ - return compareObject(o2,o1); //升序 - }else{ - return compareObject(o1,o2); //降序 + if (asc) { + return compareObject(o2, o1); // 升序 + } else { + return compareObject(o1, o2); // 降序 } } - - protected int compareObject(Object o1, Object o2){ - if(o1 instanceof Comparable && o2 instanceof Comparable){ + + protected int compareObject(Object o1, Object o2) { + if (o1 instanceof Comparable && o2 instanceof Comparable) { Comparable c1 = (Comparable) o1; Comparable c2 = (Comparable) o2; return c1.compareTo(c2); - }else{ + } else { String s1 = o1.toString(); String s2 = o2.toString(); - return s1.compareTo(s2); + return s1.compareTo(s2); } } @@ -155,38 +163,46 @@ public abstract class AbstractSortFunction extends AbstractScriptFunction { private String contextName; private String segment; private int index; + public boolean isAsc() { return asc; } + public void setAsc(boolean asc) { this.asc = asc; } + public String getContextName() { return contextName; } + public void setContextName(String contextName) { this.contextName = contextName; } + public String getSegment() { return segment; } + public void setSegment(String segment) { this.segment = segment; } + public int getIndex() { return index; } + public void setIndex(int index) { this.index = index; } } - - @SuppressWarnings("hiding") - public class FieldSortComparator implements Comparator{ + + @SuppressWarnings("hiding") + public class FieldSortComparator implements Comparator { private List fieldSortRuleList; private ScriptContext context = new DefaultScriptContext(); - + public List getFieldSortRuleList() { return fieldSortRuleList; } @@ -197,52 +213,53 @@ public abstract class AbstractSortFunction extends AbstractScriptFunction { public int compare(Object o1, Object o2) { int compareValue = 0; - try{ - for(FieldSortRule rule:fieldSortRuleList){ - Object p1 = eval(rule,o1); - Object p2 = eval(rule,o2); - if(rule.isAsc()){ - //升序 - compareValue = compareObject(p1,p2); - }else{ - //降序 - compareValue = compareObject(p2,p1); + try { + for (FieldSortRule rule : fieldSortRuleList) { + Object p1 = eval(rule, o1); + Object p2 = eval(rule, o2); + if (rule.isAsc()) { + // 升序 + compareValue = compareObject(p1, p2); + } else { + // 降序 + compareValue = compareObject(p2, p1); } - //某个字段比较出结果,直接返回;否则继续 - if(compareValue!=0){ - return compareValue; + // 某个字段比较出结果,直接返回;否则继续 + if (compareValue != 0) { + return compareValue; } } - }catch(RuntimeException e){ - throw e; - }catch(Exception e){ - throw new RuntimeException(ResourceBundleUtil.getDefaultMessage("function.run.error", getNames()),e); - } - + } catch (RuntimeException e) { + throw e; + } catch (Exception e) { + throw new RuntimeException(ResourceBundleUtil.getDefaultMessage("function.run.error", getNames()), e); + } + return compareValue; } - - private Object eval(FieldSortRule rule,Object obj){ + + private Object eval(FieldSortRule rule, Object obj) { context.put(rule.getContextName(), obj); try { - return (Object)AbstractSortFunction.this.getScriptEngine().execute(rule.getSegment(), context); + return (Object) AbstractSortFunction.this.getScriptEngine().execute(rule.getSegment(), context); } catch (ScriptException e) { - throw new RuntimeException(ResourceBundleUtil.getDefaultMessage("function.scirpt.error", getNames(),rule.getSegment()),e); + throw new RuntimeException( + ResourceBundleUtil.getDefaultMessage("function.scirpt.error", getNames(), rule.getSegment()), + e); } } - - protected int compareObject(Object p1, Object p2){ - if(p1 instanceof Comparable && p2 instanceof Comparable){ + + protected int compareObject(Object p1, Object p2) { + if (p1 instanceof Comparable && p2 instanceof Comparable) { Comparable c1 = (Comparable) p1; Comparable c2 = (Comparable) p2; return c1.compareTo(c2); - }else{ + } else { String s1 = p1.toString(); String s2 = p2.toString(); - return s1.compareTo(s2); + return s1.compareTo(s2); } } } - } -- Gitee