4

Javaを使用して2,3,6,7,8,10,12,14,15,16のような文字列入力を2-3,6-8,10,12,14-16に変換したい

以下のコードを使ってみました

        Vector ar=new Vector();

        int lastadded=0;

        String ht="";

        String [] strarray=str.split(",");

        strarray=sortArray(strarray);

        Vector intarray=new Vector();


        for(int i=0;i<strarray.length;i++)
        {

        int temp=1;
            for(int j=1;j<=intarray.size();j++)
            {
                if(Integer.parseInt(strarray[i])==Integer.parseInt(intarray.get(j-1).toString()))
                {
                 temp=0;
                }
            }
            if(temp==1)
            {
                intarray.add(Integer.parseInt(strarray[i]));
                ar.add(Integer.parseInt(strarray[i]));
            }


        }


       ht="";
       String strdemo="";
       for(int i=0;i<intarray.size();i++)
       {

            if(ht=="")
            {

                ht=ar.get(i)+"";
        lastadded=i;
            }

        else
         {
             strdemo=(String)ht;
            if(strdemo.length()==ar.get(0).toString().length())
            {

   if(Integer.parseInt(strdemo.substring(0))==Integer.parseInt(ar.get(i).toString())-1)
             {
                 strdemo=strdemo+"-"+ar.get(i);
                 lastadded=Integer.parseInt(ar.get(i).toString());
                 ht=strdemo;
             }
             else
             {
                 strdemo=strdemo+","+ar.get(i);
                 lastadded=Integer.parseInt(ar.get(i).toString());
                 ht=strdemo;
             }
            }
            else if(strdemo.length()==3)
            {
                 strdemo=(String)ht;
                 if(Integer.parseInt(strdemo.substring(strdemo.length()-1,strdemo.length()))==Integer.parseInt(ar.get(i).toString())-1)
                 {
                     strdemo=strdemo.substring(0,strdemo.length()-2)+"-"+Integer.parseInt(ar.get(i).toString());
                     lastadded=Integer.parseInt(ar.get(i).toString());
                     ht=strdemo;
                 }
                 else
                 {
                     strdemo=strdemo+","+Integer.parseInt(ar.get(i).toString());
                     lastadded=Integer.parseInt(ar.get(i).toString());
                     ht=strdemo;
                 }
            }//Else IF
            else{
                strdemo=(String)ht;
                int de=1;


                int ddd=lastadded;
                 if(ddd==Integer.parseInt(ar.get(i).toString())-1)
                 {
                      int lastaddedlen=(lastadded+"").length();
                      String symbol=strdemo.substring(strdemo.length()-lastaddedlen-1,strdemo.length()-lastaddedlen);
                     if(symbol.equalsIgnoreCase("-"))
                       strdemo=strdemo.substring(0,strdemo.length()-lastaddedlen-1)+"-"+Integer.parseInt(ar.get(i).toString());
                     else
                     strdemo=strdemo+"-"+Integer.parseInt(ar.get(i).toString());
                     lastadded=Integer.parseInt(ar.get(i).toString());
                     ht=strdemo;
                 }
                 else
                 {
                     strdemo=strdemo+","+Integer.parseInt(ar.get(i).toString());
                     lastadded=Integer.parseInt(ar.get(i).toString());
                     ht=strdemo;
                 }
            }
    }
}

ここでsortArray、関数は配列を降順で並べ替えて返します

protected static String[] sortArray(String ss[])
    {
        String temp;
        for(int i=0;i<ss.length;i++)
        {
            for(int j=0;j<ss.length;j++)
            {
             if(Integer.parseInt(ss[i])<Integer.parseInt(ss[j]))
             {
                temp=ss[i];
                ss[i]=ss[j];
                ss[j]=temp;
             }
            }
        }
        return ss;
    }

いくつかの入力で一貫した結果が得られていません。たとえば、以下の場合 (これ2,3,6,7,8,10,12,14,15,16正しい)ですが、 2,4-8,10,12,14-16が得られます。2-3,6-8,10,12,14-162,4,5,6,7,8,10,12,14,15,162-8,10,12,14-16 (which actually should have been )

コードがどこで矛盾するのかは、私が知る必要があることです。

4

2 に答える 2

3

これはJavaではかなり醜く冗長ですが、ここにバージョンがあります。些細なことですが、Stringコレクションをコンマ区切りの文字列に変換する醜いプロセスのために、SpringのStringUtilsを最後に使用することに注意してください。

重要なのは、別のクラスを使用して数値範囲をモデル化することです。このクラスに、それ自体を文字列に変換する方法を知らせます。そうすれば、StringBuilderへの追加に関するロジックはそれほど多くありません。

また、コレクションの観点から考えてみてください。これは常に物事をより明確にします。擬似コードは次のようなものです:Stringになり、最後にになりList<Integer>ます。List<Range>String

public class Ranges {

    // A class that models a range of integers
    public static class Range {
        private int low;
        private int high;

        public Range(int low, int high) {
            this.low = low;
            this.high = high;
        }

        public int getHigh() {
            return high;
        }

        public void setHigh(int high) {
            this.high = high;
        }

        @Override
        public String toString() {
            return (low == high) ? String.valueOf(low) : String.format("%d-%d", low, high);
        }
    }

    public static void main(String[] args) {
        String input = "2,3,6,7,8,10,12,14,15,16";

        // Turn input string into a sorted list of integers
        List<Integer> inputNumbers = new ArrayList<Integer>();
        for (String num : input.split(",")) {
            inputNumbers.add(Integer.parseInt(num));
        }
        Collections.sort(inputNumbers);

        // Flatten list of integers into a (shorter) list of Ranges
        Range thisRange = null; // the current range being built
        List<Range> ranges = new ArrayList<Range>();
        for (Integer number : inputNumbers) {
            if (thisRange != null && number <= thisRange.getHigh() + 1) {
                // if we are already building a range (not null) && this new number is 
                // the old high end of the range + 1, change the high number.
                thisRange.setHigh(number);
            } else {
                // create a new range and add it to the list being built
                thisRange = new Range(number, number);
                ranges.add(thisRange);
            }
        }

        // Join List<String> into a single String
        String result = StringUtils.collectionToCommaDelimitedString(ranges);
        System.out.println("result = " + result);
    }
}
于 2012-04-26T06:35:52.757 に答える
0

これが私の実装です。この助けを願っています。

int[] a = {2,3,4,5,6,7,8,10,12, 14,15,16,18,19,21,22,26}; これらの値を、たとえば次のメソッドに渡す必要があります。

public List<String> listIntRange(int[] values)
{
    List<String> intRangeList = new ArrayList<String>();

    int first = 0;
    int current = 0;
    int prev = 0;
    int count = 0;

    if (values == null || values.length < 1)
        return intRangeList;

    first = prev = values[0];
    int index = 1;
    boolean range = false;
    for(index = 1; index < values.length; index++)
    {
        current = values[index];
        if(current - prev == 1)
        {
            range = true;   
            prev = current;
            continue;
        }

        if(range == true)
        {
            intRangeList.add(first + "-" + prev);
        }
        else
        {
            intRangeList.add("" + first);
        }

        first = current;
        prev = current;
        range = false;

    }

    if(range == true)
    {
        intRangeList.add(first + "-" + current);
    }
    else
    {
        intRangeList.add("" + current);
    }

    return intRangeList;
}

intRangeListから値を出力すると、出力は次のようになります。

2-8,10,12,14-16,18-19,21-22,26,

最後のコンマ'、'は無視してください。

于 2012-04-26T07:44:07.877 に答える