2016-12-19 2 views
1

Я пытаюсь написать свое первое расширение Netlogo, которое можно с надеждой сравнить со списками строк. Поскольку я новичок в написании расширений и не знаю много о программировании Java, я надеюсь на помощь.Netlogo Extension: Сравнение списков строк

Мой код до сих пор:

package org.nlogo.extensions.string; 

import org.nlogo.api.Argument; 
import org.nlogo.api.Context; 
import org.nlogo.api.DefaultReporter; 
import org.nlogo.api.ExtensionException; 
import org.nlogo.api.LogoException; 
import org.nlogo.api.Syntax; 
import org.nlogo.api.LogoListBuilder; 
import org.nlogo.api.LogoList; 


public class Matching2 extends DefaultReporter{ 

@Override 
public Syntax getSyntax(){ 
    return Syntax.reporterSyntax(new int[] { Syntax.ListType(), Syntax.ListType() }, 
           Syntax.ListType()); 
} 


@Override 
public Object report(Argument args[], Context context) 
     throws ExtensionException, LogoException 
    { 
     LogoList input1 = args[0].getList() ; 
     LogoList input2 = args[1].getList(); 
     return input1.retainAll(input2); 

    } 

}

Однако, я только получаю сообщение об ошибке при попытке запустить модель ...

Thx заранее.

Edit:

error (UnsupportedOperationException) 
while observer running SHOW 
called by procedure CHECK-POTENTIAL-WORDS 
called by procedure GO 
called by Button 'go one time step' 

NetLogo is unable to supply you with more details about this error.Please report the problem at https://github.com/NetLogo/NetLogo/issues, or to [email protected], and paste the contents of this window into your report. 

java.lang.UnsupportedOperationException at org.nlogo.api.LogoList.org$nlogo$api$LogoList$$unsupported(LogoList.scala:67) 
at org.nlogo.api.LogoList$Iterator.remove(LogoList.scala:64) 
at org.nlogo.api.LogoList$Iterator.remove(LogoList.scala:54) 
at java.util.AbstractCollection.retainAll(AbstractCollection.java:410) 
at org.nlogo.extensions.string.Matching2.report(Matching2.java:28) 
at org.nlogo.prim._externreport.report(_externreport.java:50) 
at org.nlogo.prim.etc._show.perform(_show.scala:13) 
at org.nlogo.nvm.Context.stepConcurrent(Context.java:91) 
at org.nlogo.nvm.ConcurrentJob.step(ConcurrentJob.java:82) 
at  org.nlogo.job.JobThread.org$nlogo$job$JobThread$$runPrimaryJobs(JobThread.scala:143) 
at org.nlogo.job.JobThread$$anonfun$run$1.apply$mcV$sp(JobThread.scala:78) 
at org.nlogo.job.JobThread$$anonfun$run$1.apply(JobThread.scala:76) 
at org.nlogo.job.JobThread$$anonfun$run$1.apply(JobThread.scala:76) 
at scala.util.control.Exception$Catch.apply(Exception.scala:88) 
at org.nlogo.util.Exceptions$.handling(Exceptions.scala:41) 
at org.nlogo.job.JobThread.run(JobThread.scala:75) 
+1

ЧТО ошибка вы получаете? –

+0

Может ли быть ошибка, указав, что оставшийся список пуст? –

ответ

0

LogoList реализация интерфейса List не поддерживает метод retainAll() - то есть, потому что реализация по умолчанию этого метода, в AbstractCollection, использует remove() метод итератора, который unsupportedLogoList - см. его исходный код: https://github.com/NetLogo/NetLogo/blob/c56cffd5b12cf135efc4c3640b3cc0d5dc2acc3c/parser-core/src/main/core/LogoList.scala

Обход проблемы: создайте свои собственные объекты списка с реализацией, поддерживающей эту операцию (например,):

List input1 = new ArrayList(args[0].getList()); 
List input2 = new ArrayList(args[1].getList()); 

input1.retainAll(input2); 
return input1; 

Но если вы обязаны вернуть LogoList, это может не сработать - попробуйте вместо этого:

return new LogoList(input1); 
+0

Привет, спасибо за ваш ответ, но результат - это только истина/ложь, указывающая, находятся ли элементы в списке a в списке b (false) или нет (true). –

+0

@MatthiasMueller В результате получается ArrayList или логотип. Или вы имеете в виду это ** должно быть ** только логическим? Он также не был в вашем исходном коде. Затем уточните свои ожидания для своего метода. –

+0

Привет, я хочу, чтобы он создал список строк, которые находятся на обоих входах, но вместо этого я получаю только логическое (true/false). –

Смежные вопросы