web-dev-qa-db-ja.com

int配列をString配列に変換する

だから私はintのこの「リスト」を持っています。 Vectorint[]List<Integer>、 なんでも。

しかし、私の目標は、intを並べ替えてString[]。どのようにint配列が空中で開始されるか。

例:始まる:{5,1,2,11,3}次で終わる:String[] = {"1","2","3","5","11"}

とにかくこれをforループなしで行うことはできますか? intを収集するためのforループがあります。別のforループの実行をスキップしたい。

19
dev4life
int[] nums = {5,1,2,11,3}; //List or Vector
Arrays.sort(nums); //Collections.sort() for List,Vector
String a=Arrays.toString(nums); //toString the List or Vector
String ar[]=a.substring(1,a.length()-1).split(", ");
System.out.println(Arrays.toString(ar));

更新:

短いバージョン:

int[] nums = {-5,1,2,11,3};
Arrays.sort(nums);
String[] a=Arrays.toString(nums).split("[\\[\\]]")[1].split(", "); 
System.out.println(Arrays.toString(a));  
21
Emil

Java 8.から入手できるStreamを使用します。8。intの「リスト」を含むStreamインスタンスを取得するには:

  • _int[]_ の場合
    • IntStream intStream = Arrays.Stream(nums);または
    • Stream<Integer> intStream = Arrays.Stream(nums).boxed();下のクラスと同じクラスが必要な場合。
  • _Collection<Integer>_インターフェースを持つクラス(例:_Vector<Integer>_、_List<Integer>_)
    • Stream<Integer> intStream = nums.stream();

最後に、_String[]_を取得するには:

_String[] answer = intStream.sorted().mapToObj(String::valueOf).toArray(String[]::new);
_
12
Skywave

代わりにwhileループを使用できますか?

@Test
public void test() {
    int[] nums = {5,1,2,11,3};

    Arrays.sort(nums);

    String[] stringNums = new String[nums.length];
    int i = 0;
    while (i < nums.length) {
        stringNums[i] = String.valueOf(nums[i++]);
    }

    Assert.assertArrayEquals(new String[]{"1","2","3","5","11"}, stringNums);
}

JUnitアサーションの使用。

すみません。しかし、forループを使用できないと言うのは難しいです-どういうわけかリストをiterateする必要があります。ライブラリメソッドを呼び出してソートする場合(cf Collections.sort() )-ループしますsomehow要素の上。

8
Noel M

Guava を使用した簡単な解決策:

_public List<String> toSortedStrings(List<Integer> ints) {
  Collections.sort(ints);
  return Lists.newArrayList(Iterables.transform(ints, 
      Functions.toStringFunction()));
}
_

明らかに、このソリューション(他のソリューションと同様)は内部でループを使用しますが、読み取る必要のあるコードからそれを取得します。最初に_Collections.sort_を使用する代わりに、Ordering.natural().sortedCopy(ints)の結果をintsに渡すことで、transformの順序を変更しないようにすることもできます。また、結果のリストに新しい要素を追加する必要がない場合は、_Lists.newArrayList_の部分は必要ありません。

静的インポートを使用したそのメソッド本体の短縮バージョン:

_return transform(Ordering.natural().sortedCopy(ints), toStringFunction());
_
5
ColinD

TreeSetを使用している場合は、(長い)ワンライナーを使用します(itemsがTreeSetであると仮定)。

final String[] arr =
    items.toString() // string representation
        .replaceAll("\\D+", " ") // replace all non digits with spaces
        .trim() // trim ends
        .split(" "); // split by spaces

テストコード:

Set<Integer> items = new TreeSet<Integer>(Arrays.asList(5, 1, 2, 11, 3));

// insert above code here

System.out.println(Arrays.toString(arr));

出力:

[1, 2, 3, 5, 11]

編集:

OK、int配列を直接操作する別のバージョンを次に示します。しかし、残念ながらそれはワンライナーではありません。ただし、重複は維持され、おそらくより高速です。

再度編集:

リクエストに応じて、バグが修正され、負の数がサポートされました。

もう一度編集:正規表現パスは1つだけで、トリムなし

    final int[] in = { 5, 1, 2, 11, 3, 2, -5 }; // with duplicate
    Arrays.sort(in);
    final String[] out =
        Arrays.toString(in)
            .replaceAll("(?:\\[?)([-\\d]+)(?:\\]?)", "$1") // just remove [ and ]
            .split("\\s*,\\s*"); // split by comma

    System.out.println(Arrays.toString(out));

出力:

[-5, 1, 2, 2, 3, 5, 11]

または完全に正規表現なし(split()は別として)、ただし1つ追加のステップがあります。

final int[] in = { 5, 1, 2, 11, 3, 2, -5 }; // with duplicate
Arrays.sort(in);
final String stringRep = Arrays.toString(in);
final String[] out =
    stringRep.substring(1, stringRep.length() - 1).split("\\s*,\\s*");

System.out.println(Arrays.toString(out));

出力:

[-5, 1, 2, 2, 3, 5, 11]

更新:私の最後の2つのソリューションから空白を取り除きました。

4

Functional Java を使用して、

import fj.data.List;
import static fj.data.List.*;
import static fj.pre.Show.*;
.
.
.
final List<Integer> xs = list(5,1,2,11,3);
final List<String> ys = xs.sort(Ord.intOrd).map(
  new F<Integer, String>() {
    @Override public String f(final Integer i) {
       return String.valueOf(i);
    }
  }
);
listShow(stringShow).println(ys);
3
missingfaktor

別のforループの実行をスキップしたい。

それはばかげています。これは、コードを実行するための愚かな欲求であり、愚かな基礎です。コードに必要な品質をより適切に表現できる場合は、読みやすい、または実行しやすい、テストが容易、または堅牢である必要があることについて、話し合います。ただし、「スキップしたい」というだけでは、作業に役立つ情報は得られません。

3
Carl Manaster

このようなものはどうですか:

List<String> stringList = new ArrayList<String>();
List<Integer> list = new ArrayList<Integer>(Arrays.asList(5,1,2,11,3));
Collections.sort(list);
Iterator<Integer> iterator = list.iterator();
while(iterator.hasNext()) {
  stringList.add(iterator.next().toString());
}
System.out.println(stringList);
1
Adam

EclipseコレクションMutableIntList の使用:

String[] result = IntLists.mutable.with(5, 1, 2, 11, 3)
        .sortThis()
        .collect(Integer::toString)
        .toArray(new String[]{});

Assert.assertArrayEquals(
        new String[]{"1", "2", "3", "5", "11"}, result);

または、可読性を潜在的な効率と引き換えに:

MutableIntList intList = IntLists.mutable.with(5, 1, 2, 11, 3).sortThis();
String[] result = intList.injectIntoWithIndex(
        new String[intList.size()], 
        (r, each, index) -> {
            r[index] = Integer.toString(each);
            return r;
        });

Assert.assertArrayEquals(
        new String[]{"1", "2", "3", "5", "11"}, result);

注:私はEclipseコレクションのコミッターです

1
Donald Raab

Java 8方法、ループなし:

 // Given
int[] array         = {-5, 8, 3, 10, 25};
// When
String[] actual = Arrays.stream(array)
        .sorted()
        .mapToObj(String::valueOf)
        .toArray(String[]::new);
// Then
String[] expected = {"-5", "3", "8", "10", "25"};

assertArrayEquals(expected, actual);
0
Maxim Pavlov

Collections.sort()を使用してリストを反復処理し、各要素をcollectString.valueOf()することができます。

http://download.Oracle.com/javase/6/docs/api/Java/util/Collections.html#sort%28Java.util.List%29

Vectorの場合、最初にCollections.list(Enumeration e)を使用してリストを取得します。

配列の場合、Arrays.sort()の代わりにCollections.sort()を使用します。

http://download.Oracle.com/javase/6/docs/api/Java/util/Arrays.html#sort%28int%5b%5d%29

0
gpeche

元のforループ内でこれらの値を単にStringにキャストして、int配列ではなくString配列を作成してみませんか?開始点から最初の整数を収集し、各forループの反復で追加する場合、以下はint配列ではなくString配列を作成する簡単な方法です。同じ値のint配列とString配列の両方が必要な場合は、同じforループで両方を作成し、それで完了します。

yourInt = someNumber;

for (int a = 0; a < aLimit; a ++) {

String stringName = String.valueOf(yourInt);
StringArrayName[a] = stringName;
yourInt ++;

}

または、両方が必要な場合:

yourInt = someNumber;

for (int a = 0; a < aLimit; a ++) {

String stringName = String.valueOf(yourInt);
StringArrayName[a] = stringName;
intArrayName[a] = yourInt;
yourInt ++;

}

私は他のすべての人に同意します。 forループは簡単に構築でき、実行にほとんどオーバーヘッドが不要で、コードを読み取るときに簡単に実行できます。エレガンスをシンプルに!

0
elfinkind

この問題は、次のように正規表現を使用して解決できます。

int[] intArray = {1, 2, 3, 4, 5, 6, 7, 8};
String str = new String(Arrays.toString(intArray));
String stripNoneDigits= str.replaceAll("[^\\d]", "");
String[] stringArray = stripNoneDigits.split("");
0
Intelligent