如果我有两条路径,如何找到两条路径中最长的公共路径?
import java.nio.file.Path;
import java.nio.file.Paths;
Path common(Path pathA, Path pathB) {
...
}
...
common(Paths.get("/a/b/c/d/e"), Paths.get("/a/b/c/g/h"))
Run Code Online (Sandbox Code Playgroud)
预期输出:
Paths.get("/a/b/c")
Run Code Online (Sandbox Code Playgroud) 我有以下 XML:
<?xml version="1.0"?>
<products>
<product at1="a"
at2="b"
at3="c">
</product>
</products>
Run Code Online (Sandbox Code Playgroud)
和以下 XSLT:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)
理论上,xslt 应该保持输入 xml 不变。但是,我处理后得到的输出是:
<?xml version="1.0"?>
<products>
<product at1="a" at2="b" at3="c">
</product>
</products>
Run Code Online (Sandbox Code Playgroud)
有什么办法可以防止变压器重新格式化属性之间的间距。我知道输入和输出 xml 在功能上是等效的,但我想保留每行格式的属性以供人类阅读。如果重要的话,我使用 ubuntu 的 xsltproc 来做这个转换:
xsltproc -o test2.xml test.xslt test.xml
Run Code Online (Sandbox Code Playgroud) 我想List在 Java 中对一个项目进行排序,并让排序返回一个新的排序List而不改变原始List. 有没有一个常用的库可以做到这一点?
我希望能够使用来自Java的Groovy的元编程功能向String对象的实例添加属性.
要从Groovy执行此操作很简单:
class GroovyClass {
def getDynamicString() {
def myString = "hello"
myString.metaClass.dynamicProperty = "there"
return myString
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的Spock测试用例:
def "should add dynamic property"() {
GroovyClass groovyClass = new GroovyClass()
when:
def theString = groovyClass.getDynamicString()
then:
theString == "hello"
theString.dynamicProperty == "there"
}
Run Code Online (Sandbox Code Playgroud)
但是,我想从Java做同样的事情并通过相同的测试运行它.据我所知,Groovy将额外的属性和方法(如getMetaClass)添加到像String这样的JDK类中,但我不确定它是如何以及何时执行此操作的.我发现以下解决方案有效,但初始化GroovyShell并将元编程代码编写为字符串似乎很麻烦.
public String getDynamicString()
{
String myString = "hello";
GroovyShell shell = new GroovyShell();
shell.setVariable("myString", myString);
shell.setVariable("theDynamicPropertyValue", "there");
shell.evaluate("myString.metaClass.dynamicProperty = theDynamicPropertyValue");
return myString;
}
Run Code Online (Sandbox Code Playgroud)
有没有办法在不使用shell.evaluate的情况下执行上述操作 - 即直接从Java调用Groovy库方法?
long以下方法有效,但将时间转换为 a ,然后Instant将时区转换为 aTimeZone然后 a似乎有点笨拙ZoneId。有没有更干净的方法来做到这一点?
java.time.Instant instant = java.time.Instant.ofEpochMilli(jodaDateTime.getMillis());
OffsetDateTime offsetDateTime = OffsetDateTime.ofInstant(instant,
jodaDateTime.getZone().toTimeZone().toZoneId());
Run Code Online (Sandbox Code Playgroud) 我想从XML文档中删除某些标记作为过滤过程的一部分,但我不能修改XML的外观或结构.
输入XML以字符串形式出现,例如:
<?xml version="1.0" encoding="UTF-8"?>
<main>
<mytag myattr="123"/>
<mytag myattr="456"/>
</main>
Run Code Online (Sandbox Code Playgroud)
并且输出需要删除mytag属性值的位置,例如456:
<?xml version="1.0" encoding="UTF-8"?>
<main>
<mytag myattr="123"/>
</main>
Run Code Online (Sandbox Code Playgroud)
diff应该仅显示已删除的标签作为输入和输出之间的差异.
我已经研究过SAX,StAX和JAXB,但它看起来不像使用任何这些API输入的格式输出XML.它们将形成结构良好的XML,具有适当的缩进和空格,有时似乎显示与输入的差异.
我当前的方法使用正则表达式,但不是很健壮,因为它没有考虑构造上述XML的所有可能方法.例如,要匹配属性值:
myAttr\s*=\s*"([^"]*)"
Run Code Online (Sandbox Code Playgroud)
这适用于上面的示例,但在给定此XML标记时无效:
<mytag myattr=
123></mytag>
Run Code Online (Sandbox Code Playgroud)
在这种情况下,正则表达式真的是最佳选择吗?
我有一个无法比较的对象列表.但是,我仍然希望根据提供的索引位置数组对此对象列表进行排序.排序此列表的最快和最有效的方法是什么?这是一个例子:
List<Colour> list = new ArrayList<Colour>();
list.add(Colour.BLUE);
list.add(Colour.GREEN);
list.add(Colour.RED);
list.add(Colour.YELLOW);
list.add(Colour.GREEN);
int[] order = new int[] {3, 1, 2, 0, 4};
Run Code Online (Sandbox Code Playgroud)
最终列表应如下所示:
[YELLOW, GREEN, RED, BLUE, GREEN]
Run Code Online (Sandbox Code Playgroud)
我的具体要求是Java解决方案,但我也很想知道其他语言的解决方案.
在关于multimethods的clojure.org文档中,它指出:
Clojure multimethods ... can do validation of arguments and route to error-handling methods etc.
但是,我没有看到很多人为此目的使用多方法的例子.在我只需要实现单个方法定义的情况下,使用多方法进行输入验证仍然有意义吗?例如:
(defmulti divide
(fn [a b] (if (zero? b)
(throw (IllegalArgumentException. "Cannot divide by zero"))
:ok)))
(defmethod divide :ok [a b] (quot a b))
Run Code Online (Sandbox Code Playgroud)
这样做的好处是它可以最终实现divide清理输入检查或错误处理.是否有更多惯用的方法来获得验证,错误处理和清晰的语法?