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("_");

あなたはparts[1]とparts[2]に興味があります。最初は簡単です、それはただの数です。

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

2つ目は、常に「VX」の形式で、Xは数字です。ただし、この部分は存在しない可能性があります(ファイルのベースバージョンの場合)。その場合、バージョンは0であると言えます。

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

これで、これら2つの数値に基づいて比較できます。

簡単にするために、これに基づいてクラスFileIdentifierを作成します。

class FileIdentifier {
     int fileNumber;
     int versionNumber;
}

次に、前に説明した内容に基づいたロジックを使用して、ファイル名からFileIdentifierを作成する関数。

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

次に、Stringでコンパレータを作成します。ここで、2つの文字列のFileIdentifierを取得し、FileIdentifierメンバーを比較します。

次に、「最大値」の文字列を取得するには、すべての文字列をリストに入れ、を使用Collections.sortしてコンパレータを提供します。

于 2013-02-28T14:17:02.587 に答える
1

ファイル名を 2 つのステップで処理する必要があります。

ステップ 1: リストをサブリストに分割し、ファイル名ごとに 1 つのサブリストを作成します (接尾辞は無視します)。リストをマップに分割する例を次に示します。

 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 に答える