web-dev-qa-db-ja.com

整数から整数への配列C#

私はint "123456"の各値をInt []に分割する必要があり、すでにソリューションがありますが、もっと良い方法があるかどうかわかりません:私のソリューションは:

public static int[] intToArray(int num){
    String holder = num.ToString();
    int[] numbers = new int[Holder.ToString().Length]; 
    for(int i=0;i<numbers.length;i++){
        numbers[i] = Convert.toInt32(holder.CharAt(i));
    }
    return numbers;
}
19
Burimi

これは、前後に変換するよりも優れていると思います。 JBSnorroの答えとは対照的に、配列に変換した後は逆になります。したがって、IEnumerable´を避けてください。このメソッドは負でない数で機能するため、_0_は_new int[1] { 0 }_を返します。

負の数で動作する場合は、n = Math.Abs(n)を実行できますが、それは理にかなっていないと思います。

さらに、パフォーマンスを向上させる必要がある場合は、最初の最終配列を作成して、ifステートメントの組み合わせのようなバイナリ検索を行い、桁数を決定します。

_public static int[] digitArr(int n)
{
    if (n == 0) return new int[1] { 0 };

    var digits = new List<int>();

    for (; n != 0; n /= 10)
        digits.Add(n % 10);

    var arr = digits.ToArray();
    Array.Reverse(arr);
    return arr;
}
_

2018年の更新:

_public static int numDigits(int n) {
    if (n < 0) {
        n = (n == Int32.MinValue) ? Int32.MaxValue : -n;
    }
    if (n < 10) return 1;
    if (n < 100) return 2;
    if (n < 1000) return 3;
    if (n < 10000) return 4;
    if (n < 100000) return 5;
    if (n < 1000000) return 6;
    if (n < 10000000) return 7;
    if (n < 100000000) return 8;
    if (n < 1000000000) return 9;
    return 10;
}

public static int[] digitArr2(int n)
{
    var result = new int[numDigits(n)];
    for (int i = result.Length - 1; i >= 0; i--) {
        result[i] = n % 10;
        n /= 10;
    }
    return result;
}
_
18
Lasse Espeholt

LINQを使用した簡単なソリューション

 int[] result = yourInt.ToString().Select(o=> Convert.ToInt32(o)).ToArray()
27
Jahan Zinedine
int[] outarry = Array.ConvertAll(num.ToString().ToArray(), x=>(int)x);

しかし、1、2、3、4、5に変換する場合:

int[] outarry = Array.ConvertAll(num.ToString().ToArray(), x=>(int)x - 48);
11
Saeed Amiri

Intから文字列への変換およびその逆の変換は、おそらくそれほど高速ではありません。私は次を使用します

public static int[] ToDigitArray(int i)
{
    List<int> result = new List<int>();
    while (i != 0)
    {
        result.Add(i % 10);
        i /= 10;
    }
    return result.Reverse().ToArray();
}

これは厳密に正の整数に対してのみ機能することに注意する必要があります。

編集:

私は代替案を思いつきました。実際にパフォーマンスが問題になる場合、これはおそらくより高速になりますが、特定の使用法やアプリケーションについては自分で確認することによってのみ確認できます。

public static int[] ToDigitArray(int n)
{
    int[] result = new int[GetDigitArrayLength(n)];
    for (int i = 0; i < result.Length; i++)
    {
        result[result.Length - i - 1] = n % 10;
        n /= 10;
    }
    return result;
}
private static int GetDigitArrayLength(int n)
{
    if (n == 0)
        return 1;
    return 1 + (int)Math.Log10(n);
}

これは、nが非負の場合に機能します。

5
JBSnorro

私はこのようにします:

var result = new List<int>();
while (num != 0) {
    result.Insert(0, num % 10);
    num = num / 10;
}
return result.ToArray();

パフォーマンスはやや劣りますが、よりエレガントになる可能性があります。

return num.ToString().Select(c => Convert.ToInt32(c.ToString())).ToArray();

これらは両方とも49,50,51,52,53,54ではなく1,2,3,4,5,6を返すことに注意してください(つまり、文字 '1'、 '2'、 '3'、 'のバイトコードコードと同様に4 '、' 5 '、' 6 ')。これが実際の意図だと思いますか?

3
MarkXA

それを文字列に変換して戻すことなく行うことができます:

public static int[] intToArray(int num) {
  List<int> numbers = new List<int>();
  do {
    numbers.Insert(0, num % 10);
    num /= 10;
  } while (num > 0);
  return numbers.ToArray();
}

もちろん、正の値に対してのみ機能しますが、元のコードにもその制限があります。

2
Guffa

私は同様の要件を持っていました..私は多くの良いアイデアから取り、いくつかの不足している部分を追加しました。多くの人々がゼロまたは負の値を処理していませんでした。これは私が思いついたものです:

    public static int[] DigitsFromInteger(int n)
    {
        int _n = Math.Abs(n);
        int length = ((int)Math.Log10(_n > 0 ? _n : 1)) + 1;
        int[] digits = new int[length];
        for (int i = 0; i < length; i++)
        {
            digits[(length - i) - 1] = _n % 10 * ((i == (length - 1) && n < 0) ? -1 : 1);
            _n /= 10;
        }
        return digits;
    }

これはかなりきれいだと思います..しかし、各反復で条件付きチェックといくつかの余分な計算を行っているのは事実です。

    public static int[] DigitsFromInteger(int n)
    {
        int _n = Math.Abs(n);
        int length = ((int)Math.Log10(_n > 0 ? _n : 1)) + 1;
        int[] digits = new int[length];
        for (int i = 0; i < length; i++)
        {
            //digits[(length - i) - 1] = _n % 10 * ((i == (length - 1) && n < 0) ? -1 : 1);
            digits[(length - i) - 1] = _n % 10;
            _n /= 10;
        }
        if (n < 0)
            digits[0] *= -1;
        return digits;
    }
1
jared
string DecimalToBase(int iDec, int numbase)
        {
            string strBin = "";
            int[] result = new int[32];
            int MaxBit = 32;
            for(; iDec > 0; iDec/=numbase)
            {
                int rem = iDec % numbase;
                    result[--MaxBit] = rem;
            } 
            for (int i=0;i<result.Length;i++)
                if ((int)result.GetValue(i) >= base10)
                    strBin += cHexa[(int)result.GetValue(i)%base10];
                else
                    strBin += result.GetValue(i);
            strBin = strBin.TrimStart(new char[] {'0'});
            return strBin;
        }
        int BaseToDecimal(string sBase, int numbase)
        {
            int dec = 0;
            int b;
            int iProduct=1;
            string sHexa = "";
            if (numbase > base10)
                for (int i=0;i<cHexa.Length;i++)
                    sHexa += cHexa.GetValue(i).ToString();
            for(int i=sBase.Length-1; i>=0; i--,iProduct *= numbase)
            {
                string sValue = sBase[i].ToString();
                if (sValue.IndexOfAny(cHexa) >=0)
                    b=iHexaNumeric[sHexa.IndexOf(sBase[i])];
                else 
                    b= (int) sBase[i] - asciiDiff;
                dec += (b * iProduct);
            } 
            return dec; 
        }
1
Muthu
_ private static int[] ConvertIntToArray(int variable)
        {
            string converter = "" + variable;
            int[] convertedArray = new int[converter.Length];
            for (int i=0; i < convertedArray.Length;i++) //it can be also converter.Length
            {
                convertedArray[i] = int.Parse(converter.Substring(i, 1));
            }
            return convertedArray;
        }
_

メソッドを使用してintを取得します。次に、すぐにstringに変換します(123456-> "123456")。 converterという名前の文字列があり、int値に移動します。文字列には_string.Length_があり、特に同じ長さのintがあるため、arrayという名前のconvertedArrayを作成します。これは長さを持つ、つまりconverter(string)長さ。次に、string.Substring(i,1)を使用して文字列を1つずつintに変換するループに入り、値_convertedArray[i]_を割り当てます。次に、convertedArrayを返します。mainまたはメソッドを簡単に呼び出すことができる任意のメソッドで。

整数を配列に変換するための良い解決策は次のとおりです:int a = 5478 into int [] Stringがあり、string str = 4561のようにStringを整数配列に変換する場合は問題ありません。 //に変換する
array [0] = 4;
array [1] = 5;
array [2] = 6;
array [3] = 7;

注:deviderのゼロの数(0)は入力の長さと等しく、入力の長さに応じて配列の長さを設定します
コーディングを確認してください:

         string str=4587;
            int value = Convert.ToInt32(str);
            int[] arr = new int[4];
            int devider = 10000;
            for (int i = 0; i < str.Length; i++)
            {
                int m = 0;
                devider /= 10;
                arr[i] = value / devider;
                m = value / devider;
                value -= (m * devider);
            }
0
Muhammad Irfan

ASCII文字テーブル に感謝します。 LINQ 上記 を使用した簡単な答えは、答え+ 48を生成します。

どちらか

int[] result = youtInt.ToString().Select(o => Convert.ToInt32(o) - 48).ToArray();

または

int[] result = youtInt.ToString().Select(o => int.Parse(o.ToString())).ToArray();

に使える

public static int[] intToArray(int num)
{
    num = Math.Abs(num);
    int length = num.ToString().Length;
    int[] arr = new int[length];
    do
    {
        arr[--length] = num % 10;
        num /= 10;
    } while (num != 0);

    return arr;
}

システムベース(この場合は10進数)で除算すると、右端の数字が削除され、その数字は剰余演算子で取得されます。ゼロになるまで繰り返し続けます。数字が削除されるたびに、最後に配列を崇拝する必要性を避けるために、配列の最後から逆方向に配列に格納されます。 Math.Abs​​()関数は負の入力を処理し、配列は入力長と同じサイズでインスタンス化されます。

0
M.Khalil