2

我有一个包含一些字符串的列表:

GS_456.java
GS_456_V1.java
GS_456_V2.java
GS_460.java
GS_460_V1.java

它还在继续。我想要一个包含最高值字符串的列表:

GS_456_V2.java
GS_460_V1.java
.
.
.

我只是想使用大量的 for 语句......但是没有更实用的方法吗?我想避免使用太多的 for 语句......因为我在执行一些查询时经常使用它们......

编辑:带有 V1、V2、.... 的字符串是最近创建的类的名称。例如,当有人创建新版本的 GS_456 时,他们会这样做并将其版本添加到名称的末尾。

因此,GS_456_V2 是 GS_456 java 类的最新版本。它还在继续。

提前致谢。

4

2 回答 2

1

我想你不想要简单的字典顺序(解决方案很明显)。

首先,删除“.java”部分并将字符串拆分为字符“_”。

int dotIndex = string.indexOf(".");
String []parts = split.substring(0, dotIndex).split("_");

您对部分[1] 和部分[2] 感兴趣。第一个很简单,只是一个数字。

int fileNumber = Integer.parseInt(parts[1]);

第二个总是采用“VX”的形式,其中 X 是一个数字。但是这部分可能不存在(如果它是文件的基本版本)。在这种情况下,我们可以说版本为 0。

int versionNumber = parts.length < 2 ? 0 : Integer.parseInt(parts[2].substring(1));

现在您可以根据这两个数字进行比较。

为简单起见,基于此构建一个 FileIdentifier 类:

class FileIdentifier {
     int fileNumber;
     int versionNumber;
}

然后是一个从文件名创建 FileIdentifier 的函数,其逻辑基于我之前解释的内容。

FileIdentifier getFileIdentifierFromFileName(String filename){ /* .... */ }

然后在 String 上创建一个比较器,在其中获取两个字符串的 FileIdentifier 并在 FileIdentifier 成员上进行比较。

然后,要获得具有“最高值”的字符串,只需将所有字符串放在一个列表中,然后使用Collections.sort,提供比较器。

于 2013-02-28T14:17:02.587 回答
1

您需要分两步处理文件名。

第 1 步:将列表拆分为子列表,每个文件名有一个子列表(忽略后缀)。这是一个将列表拆分为 Map 的示例:

 private static Map> nameMap = new HashMap>();

    private static void splitEmUp(final List names)
    {
        for (String current : names)
        {
            List listaly;
            String[] splitaly = current.split("_|\\.");

            listaly = nameMap.get(splitaly[1]);
            if (listaly == null)
            {
                listaly = new LinkedList();
                nameMap.put(splitaly[1], listaly);
            }

            listaly.add(current);
        }

第 2 步:找到每个名称的最高前缀。这是一个例子:

 private static List findEmAll()
    {
        List returnValue = new LinkedList();

        Set keySet = nameMap.keySet();
        for (String key : keySet)
        {
            List listaly = nameMap.get(key);
            String highValue = null;

            if (listaly.size() == 1)
            {
                highValue = listaly.get(0);
            }
            else
            {
                int highVersion = 0;

                for (String name : listaly)
                {
                    String[] versions = name.split("_V|\\.");

                    if (versions.length == 3)
                    {
                        int versionNumber = Integer.parseInt(versions[1]);
                        if (versionNumber > highVersion)
                        {
                            highValue = name;
                            highVersion = versionNumber;
                        }
                    }
                }
            }

            returnValue.add(highValue);
        }

        return returnValue;
    }
于 2013-02-28T15:42:05.797 回答