2010-09-01 4 views
15

Итак, у меня есть этот «список» для ints. Это может быть Vector, int[], List<Integer>, что угодно.Преобразование массива int в массив строк

Моя цель состоит в том, чтобы сортировать данные и заканчивать с String[]. Как начинается массив int в воздухе.

например: Начните с: {5,1,2,11,3} End с: String[] = {"1","2","3","5","11"}

Есть в любом случае сделать это без для цикла? У меня есть петля для сбора ints. Я предпочел бы пропустить выполнение цикла for.

+2

Пожалуйста, повторно задать свой вопрос с соответствующим языком. –

+5

Почему вы хотите избежать циклов? Любое решение, которое любой человек придумает, будет иметь какой-то цикл, даже если он скрыт за вызовом метода. –

+0

В нем говорится: «Это для Java», у него есть тег java, и он не редактировался - ваш комментарий кажется бессмысленным?!? Я не думаю, что это возможно завершить без цикла (несколько фактически, поскольку сортировка может быть выполнена только через какой-то цикл/итеративный процесс). – Rudu

ответ

18
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)); 
+0

Я думаю, что это может быть ответ. Я не хотел переходить через список во второй раз, потому что я уже итерации, чтобы получить список int. Спасибо. – ovaherenow

+1

, если вы беспокоитесь о скорости, то лучше использовать нормальный цикл для повтора, потому что в Arrays.toString() они используют цикл for.Проверьте источник (http://www.docjar.com/html/api/java /util/Arrays.java.html). Но если вы просто хотите, чтобы ваш код выглядел небольшим, тогда вы можете использовать приведенный выше код или другой вариант - просто написать небольшую функцию для отправки int [] в качестве входного и возвращаемого массива String [] как выход. – Emil

+0

«[\\ [\\]]» является регулярным выражением, правильно? Откуда вы знаете, какой из них использовать, и что именно это диктует? – Chance

0

Вы можете использовать Collections.sort(), а затем перебрать по списку и собрать String.valueOf() каждый элемент.

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

для вектора, вы бы сначала получить список с 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

'Vector' is-a' List'. –

+0

О, да, это так. Я не использую 'Vector' столько, сколько они устарели, поэтому я не знал, что они стали« List's. Я вспомнил, когда вы перебирали их с помощью Vector.elements() '(давно). – gpeche

+2

Vector, Hashtable, StringBuffer: Эти классы все устарели, но люди продолжают их использовать. Новые люди тоже. Интересно, где они узнают, что ... –

8

Могу ли я использовать 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); 
} 

Использование утверждений Юнита.

Извините, я легкомыслен. Но говорить, что вы не можете использовать петлю for, является глупым - у вас есть итерации над списком. Если вы собираетесь вызвать метод библиотеки, чтобы отсортировать его для вас (cf Collections.sort()) - это будет цикл как-то над элементами.

+0

где сортировка? –

+0

Извините, опередил меня. –

1

Как о чем-то вроде этого:

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); 
4

Если вы используете 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 

Test код:

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] 

EDIT:

ОК, вот другая версия, которая работает с Int массива напрямую. Но, к сожалению, это не однострочный.Тем не менее, это не держать дубликаты, и это, вероятно, быстрее

EDIT снова:

ошибка фиксированной и поддерживается отрицательные числа, в соответствии с просьбой:

EDIT еще раз: только один регулярное выражение проход и никакой отделки

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] 

Или совсем без регулярных выражений (кроме раскола()), но с еще одним шагом добавлено:

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] 

Update: раздели пробелы из моих последних двух решений , надеюсь, что вы счастливы сейчас :-)

+1

Это не сработает правильно для любого массива или списка с более чем 1 из того же элемента. – ColinD

+0

+1 @ColinD. 'TreeSet' будет сортировать номера для вас, но он также удалит дубликаты, что не является тем, что предназначено. – missingfaktor

+0

Я знаю, но никто ничего не сказал о том, чтобы держать обманы –

3

Я предпочел бы пропустить сделать другое для .

Это глупо. Это глупое желание и глупая основа для осуществления упражнений с кодом. Если вы можете лучше выразить те качества, которые хотите, чтобы ваш код имел, то нам есть о чем поговорить - что это должно быть легко читать, скажем, или выполнять, или проверять, или надежно. Но «я бы скорее пропустил это», просто не дает нам ничего полезного для работы.

+0

Потому что я уже петлю, чтобы получить список. Спасибо за игру. – ovaherenow

5

Простое решение с помощью Guava:

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

Очевидно, что это решение (как и любой другой) собирается использовать циклы внутри, но он получает его из кода, вы должны читать. Вы также можете избежать изменения порядка в ints, передав результат Ordering.natural().sortedCopy(ints) на номер transform вместо того, чтобы использовать Collections.sort. Кроме того, часть Lists.newArrayList не требуется, если вам не нужно добавлять новые элементы в результирующий список.

Укороченный вариант этого метода тела, со статическими импорта:

return transform(Ordering.natural().sortedCopy(ints), toStringFunction()); 
3

Использование 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); 
+1

это круто !! (если бы у меня были какие-то оставшиеся голоса, я бы его повысил) :-) –

+0

@seanizer: Ну, вы всегда можете вернуться и отступить. ;-) – missingfaktor

+1

Вот Upvote сейчас, как и обещал :-) –

0

Почему вы просто не переносите эти значения в String в исходный цикл for, создавая массив String, а не массив int? Предполагая, что вы собираете начальное целое из начальной точки и добавляете к ней каждую итерацию цикла, следующая простая методика создания массива String, а не массива int.Если вам нужны как массивы int, так и String с одинаковыми значениями в них, создайте их как в цикле для цикла, так и с ним.

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 ++; 

} 

Я согласен со всеми остальными. Для циклов легко создавать, не требуют почти никаких накладных расходов для запуска, и их легко отслеживать при чтении кода. Элегантность в простоте!

+0

Есть некоторые проблемы с вашим кодом. 1. из всех, никто не использует пробел в ++, пока он может работать. Не пытайтесь быть индивидуальными в стиле кодирования! 2. Что такое yourInt, someNumber? Они не существуют в вопросе, и вы не заявляете и не объясняете их. 3. 'casting' очень сужен определенный термин в Java. Нет никакого перевода из String в Int, потому что Int не является подклассом String. 4. никто не использует 's [a] = String.valueOf (yourInt);', но 's [a] =" "+ yourInt;'. 5. Почему промежуточное присвоение stringName? 6. Почему нарушение стилей кодирования и использование StringArrayName [a] вместо stringArrayName [a]? –

+0

7. Какое имя, stringArrayName! Хотя это массив из ints в качестве имен. 8. Без углублений. Все эти проблемы скрывают вашу простую, но элегантную, если применимо, идею. –

-2

Arrays.sort (nums); var stringArray = (nums.toString()). Split (','). Map (String);

+1

Не думайте, что Java имеет ключевое слово 'var'. Это похоже на JavaScript –

7

Используйте Stream, который доступен из Java 8. Для того, чтобы получить 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); 
1

Использование Eclipse CollectionsMutableIntList:

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, Коллекции

Смежные вопросы