Java ArrayList中字符串的唯一实例

Java ArrayList中字符串的唯一实例,java,arraylist,groovy,Java,Arraylist,Groovy,我对Java非常陌生。我正在构建一个数组列表来保存Git提交中的部分文本。我在Jenkins的Groovy脚本中运行这个 def commits = sh script: """ git log ${previous_tag}..HEAD --oneline --decorate""", returnStdout: true def array = commits.split("\\n"); ArrayList<String> mystats = new ArrayList&l

我对Java非常陌生。我正在构建一个数组列表来保存Git提交中的部分文本。我在Jenkins的Groovy脚本中运行这个

 def commits = sh script: """ git log ${previous_tag}..HEAD --oneline --decorate""", returnStdout: true
 def array = commits.split("\\n");

ArrayList<String> mystats = new ArrayList<>(array.length);
 for(int i =0; i < array.length; i++) {
    Pattern pattern = Pattern.compile("^\\w{7}\\s(MYSTATS-|mystats-)");
    Matcher matcher = pattern.matcher(array[i]);
  if(matcher.find()) {
     mystats.add(array[i]) 
  }
 }
原因:发生的异常: 现场当地人 现场家长 现场调用者 在e区 现场程序 现场线程 在对象org.jenkinsci.plugins.workflow.cps中。CpsThreadGroup@4f76de19


所以经过一些阅读,似乎
Set
是不可序列化的?如果是这样的话,我怎么能让一个ArrayList只保存唯一的值并拒绝重复的条目呢?

好吧,在添加完整的stacktrace之后,现在看来,
Matcher
是个问题,因为它不可序列化

你查过了吗

我问:

您会注意到一个问题:

java.io.NotSerializableException:java.util.regex.Matcher发生这种情况 因为matcher局部变量的类型(matcher)不是 认为Java可以序列化。因为管道必须存活下来,詹金斯 重新启动时,运行程序的状态会定期保存到 磁盘,以便以后可以恢复(在每一步或每一步之后都会进行保存) 步骤的中间部分,如sh)。

查看链接了解更多信息 这篇文章建议使用注释
@NonCPS
作为
Matcher
在中声明的方法。因为我又走了:

这种方法将被管道引擎视为“本机”,并且 它的局部变量从未保存

前,


代码的第二部分也是如此,除非它们在同一个类(范围)中,否则无需重新声明
匹配器

好吧,在添加完整堆栈跟踪之后,现在看来
匹配器是个问题,因为它不可序列化

你查过了吗

我问:

您会注意到一个问题:

java.io.NotSerializableException:java.util.regex.Matcher发生这种情况 因为matcher局部变量的类型(matcher)不是 认为Java可以序列化。因为管道必须存活下来,詹金斯 重新启动时,运行程序的状态会定期保存到 磁盘,以便以后可以恢复(在每一步或每一步之后都会进行保存) 步骤的中间部分,如sh)。

查看链接了解更多信息 这篇文章建议使用注释
@NonCPS
作为
Matcher
在中声明的方法。因为我又走了:

这种方法将被管道引擎视为“本机”,并且 它的局部变量从未保存

前,


代码的第二部分也是如此,除非它们在同一类(范围)中,否则无需重新声明
Matcher

不确定序列化过程发生在何处,或者应用程序尝试在何处序列化
Set
,但是,您可以使用
arraylist.contains(str)检查arraylist
在将其添加到arraylist之前,这就是您所需要的吗?这看起来不像核心java。如果您使用的是groovy或scala(或其他),请适当地标记它。上面提到的异常看起来像是在尝试序列化集合的项以将它们保存到文件中?这是哪个集合,为什么它包含
Matcher
?@tom,抱歉,是的,使用groovy,添加了标记,我没有试图写入文件,只是希望能够将集合中的每个项作为变量使用,就像RubyAs中的字符串插值一样,您可以在上看到(我已经检查了java 7版本,但您也可以在其他版本中检查它)HashSet当然是可序列化的。在添加了一小段日志之后,您的问题似乎与java.util.regex.Matcher(不可序列化的)的操作有关。可能正在用于可序列化类中?(请记住,可序列化类的所有属性也必须可序列化)。我找不到
Matcher
Set
交互的位置。我怀疑此错误是否与其他内容有关,可能是
pattern.Matcher(mystats[i])
?你能发布完整的stacktrace并标记相关的行吗?不确定序列化过程发生在哪里,或者应用程序尝试在哪里序列化
,但是,在将其添加到arraylist之前,你可以使用
arraylist.contains(str)
检查arraylist,这是你需要的吗?这看起来不像核心java。如果您使用的是groovy或scala(或其他),请适当地标记它。上面提到的异常看起来像是在尝试序列化集合的项以将它们保存到文件中?这是哪个集合,为什么它包含
Matcher
?@tom,抱歉,是的,使用groovy,添加了标记,我没有试图写入文件,只是希望能够将集合中的每个项作为变量使用,就像RubyAs中的字符串插值一样,您可以在上看到(我已经检查了java 7版本,但您也可以在其他版本中检查它)HashSet当然是可序列化的。在添加了一小段日志之后,您的问题似乎与java.util.regex.Matcher(不可序列化的)的操作有关。可能正在用于可序列化类中?(请记住,可序列化类的所有属性也必须可序列化)。我找不到
Matcher
Set
交互的位置。我怀疑此错误是否与其他内容有关,可能是
pattern.Matcher(mystats[i])
?你能发布完整的stacktrace并标记相关行吗谢谢你花时间发布这篇文章,似乎我不能
transient Matcher Matcher=null然后稍后在同一个应用程序中使用matcherscope@Richlewis真奇怪!我在Java中尝试过这个,效果很好,你可以重用它。。。我现在只是在尝试,但是需要阅读一些东西,首先不要在公共空间使用return函数。谢谢你花时间发布这篇文章,看起来我
// Put all unique mystats matches into a set
 Set<String> mystats_set = new HashSet<String>(mystats.size());
 for(int i =0; i < mystats.size(); i++) {
    Pattern pattern = Pattern.compile("(MYSTATS-|mystats-)\\w+");
    Matcher matcher = pattern.matcher(mystats[i]);
  if(matcher.find()) {
     String id = matcher.group().toUpperCase().toString();
    def jira_json = sh script: '''curl --cert ../certs/dev_cert.p12:password https://jira.dev.organisation.co.uk:port_number/rest/api/2/issue/${id}''', returnStdout: true
     mystats_set.add("[" + id + "](https://jira.dev.organisation.co.uk/browse/" + id + ")");
  }
 } 
java.io.NotSerializableException: java.util.regex.Matcher
at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:860)
at org.jboss.marshalling.river.BlockMarshaller.doWriteObject(BlockMarshaller.java:65)
at org.jboss.marshalling.river.BlockMarshaller.writeObject(BlockMarshaller.java:56)
at org.jboss.marshalling.MarshallerObjectOutputStream.writeObjectOverride(MarshallerObjectOutputStream.java:50)
at org.jboss.marshalling.river.RiverObjectOutputStream.writeObjectOverride(RiverObjectOutputStream.java:179)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:344)
at java.util.HashMap.internalWriteEntries(HashMap.java:1785)
at java.util.HashMap.writeObject(HashMap.java:1362)
at sun.reflect.GeneratedMethodAccessor202.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.jboss.marshalling.reflect.SerializableClass.callWriteObject(SerializableClass.java:271)
at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:976)
at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854)
at org.jboss.marshalling.river.RiverMarshaller.doWriteFields(RiverMarshaller.java:1032)
at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:988)
at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854)
at org.jboss.marshalling.river.RiverMarshaller.doWriteFields(RiverMarshaller.java:1032)
at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:988)
at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:967)
at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854)
at org.jboss.marshalling.river.RiverMarshaller.doWriteFields(RiverMarshaller.java:1032)
at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:988)
at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:967)
at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854)
at org.jboss.marshalling.river.RiverMarshaller.doWriteFields(RiverMarshaller.java:1032)
at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:988)
at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:967)
at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854)
at org.jboss.marshalling.river.RiverMarshaller.doWriteFields(RiverMarshaller.java:1032)
at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:988)
at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854)
at org.jboss.marshalling.river.BlockMarshaller.doWriteObject(BlockMarshaller.java:65)
at org.jboss.marshalling.river.BlockMarshaller.writeObject(BlockMarshaller.java:56)
at org.jboss.marshalling.MarshallerObjectOutputStream.writeObjectOverride(MarshallerObjectOutputStream.java:50)
at org.jboss.marshalling.river.RiverObjectOutputStream.writeObjectOverride(RiverObjectOutputStream.java:179)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:344)
at java.util.TreeMap.writeObject(TreeMap.java:2438)
at sun.reflect.GeneratedMethodAccessor204.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.jboss.marshalling.reflect.SerializableClass.callWriteObject(SerializableClass.java:271)
at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:976)
at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854)
at org.jboss.marshalling.river.RiverMarshaller.doWriteFields(RiverMarshaller.java:1032)
at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:988)
at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854)
at org.jboss.marshalling.AbstractObjectOutput.writeObject(AbstractObjectOutput.java:58)
at org.jboss.marshalling.AbstractMarshaller.writeObject(AbstractMarshaller.java:111)
at org.jenkinsci.plugins.workflow.support.pickles.serialization.RiverWriter.writeObject(RiverWriter.java:132)
at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.saveProgram(CpsThreadGroup.java:429)
at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.saveProgram(CpsThreadGroup.java:408)
at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.run(CpsThreadGroup.java:356)
at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.access$100(CpsThreadGroup.java:78)
at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup$2.call(CpsThreadGroup.java:236)
at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup$2.call(CpsThreadGroup.java:224)
at org.jenkinsci.plugins.workflow.cps.CpsVmExecutorService$2.call(CpsVmExecutorService.java:47)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at hudson.remoting.SingleLaneExecutorService$1.run(SingleLaneExecutorService.java:112)
at jenkins.util.ContextResettingExecutorService$1.run(ContextResettingExecutorService.java:28)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
@NonCPS
public void doSomeWork(){
    ArrayList<String> mystats = new ArrayList<>(array.length);
    for(int i =0; i < array.length; i++) {
        Pattern pattern = Pattern.compile("^\\w{7}\\s(MYSTATS-|mystats-)");
        Matcher matcher = pattern.matcher(array[i]);
        if(matcher.find()) {
            mystats.add(array[i]) 
        }
    }
}
transient Matcher matcher = null;

def commits = sh script: """ git log ${previous_tag}..HEAD --oneline --decorate""", returnStdout: true
def array = commits.split("\\n");

ArrayList<String> mystats = new ArrayList<>(array.length);
for(int i =0; i < array.length; i++) {
    Pattern pattern = Pattern.compile("^\\w{7}\\s(MYSTATS-|mystats-)");
    matcher = pattern.matcher(array[i]);
    if(matcher.find()) {
        mystats.add(array[i]) 
    }
}