小编Ale*_*ing的帖子

Java中找到两条路径的最长公共路径

如果我有两条路径,如何找到两条路径中最长的公共路径?

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)

java file

5
推荐指数
1
解决办法
1783
查看次数

在 XSLT 转换中保留属性之间的空格

我有以下 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)

xml xslt

4
推荐指数
1
解决办法
821
查看次数

如何在不改变列表的情况下对列表进行排序

我想List在 Java 中对一个项目进行排序,并让排序返回一个新的排序List而不改变原始List. 有没有一个常用的库可以做到这一点?

java sorting

4
推荐指数
1
解决办法
2012
查看次数

从Java添加属性到Groovy对象

我希望能够使用来自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库方法?

java groovy metaprogramming

3
推荐指数
1
解决办法
899
查看次数

将 org.joda.time.DateTime 转换为 java.time.OffsetDateTime 的最佳方法是什么?

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)

java jodatime datetime-conversion java-time

3
推荐指数
1
解决办法
7215
查看次数

在保留其结构的同时过滤XML

我想从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)

在这种情况下,正则表达式真的是最佳选择吗?

java xml parsing

2
推荐指数
1
解决办法
114
查看次数

排序不可比较的对象

我有一个无法比较的对象列表.但是,我仍然希望根据提供的索引位置数组对此对象列表进行排序.排序此列表的最快和最有效的方法是什么?这是一个例子:

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解决方案,但我也很想知道其他语言的解决方案.

java sorting

2
推荐指数
1
解决办法
804
查看次数

输入验证是Clojure中多方法的合理用法吗?

关于multimethodsclojure.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清理输入检查或错误处理.是否有更多惯用的方法来获得验证,错误处理和清晰的语法?

clojure multimethod

2
推荐指数
1
解决办法
73
查看次数