печать элементов в хорошем формате - PullRequest
2 голосов
/ 27 июля 2010

У меня есть простой, общий вопрос относительно небольшой проблемы, которая беспокоит меня: Я распечатываю список элементов на лету, поэтому у меня нет предварительных знаний о количестве напечатанных элементов. Я хочу простой формат, где элементы разделяются запятой (elem1, elem2 ...) или что-то подобное. Теперь, если я использую простой цикл вроде:

while(elements to check) {
  if (elem should be printed) {
     print elem . ","
  }
}

Я получаю запятую после последнего элемента ... Я знаю, это звучит довольно глупо, но есть ли способ справиться с этим?

Ответы [ 6 ]

4 голосов
/ 27 июля 2010

Предположим, что «должен быть напечатан» означает «хотя бы один непробельный символ. В Perl идиоматический способ написать это будет (вам нужно настроить grep по вкусу):

print join "," => grep { /\S/ } @elements;

"grep" похож на "filter" в других языках, а / S / - это регулярное выражение, соответствующее одному непробельному символу. Только элементы, соответствующие выражению, возвращаются. «Присоединение» должно быть самоочевидным.

perldoc -f join
perldoc -f grep
3 голосов
/ 27 июля 2010

способ хранения всех ваших данных в массиве, а затем

 print join(',', @yourarray)

хороший.

Вы также можете после цикла для объединения

declare eltToPrint
 while (LOOP on elt) {
       eltToPrint .= elt.','
}

удалите последнюю запятую с помощью регулярного выражения:

eltToPrint =~s/,$//;

ps: работает также, если поставить запятую в начале

eltToPrint =~s/^,//;
2 голосов
/ 27 июля 2010

Java не имеет встроенной join, но если вы не хотите изобретать велосипед, вы можете использовать Guava's Joiner. Может skipNulls или useForNull(something).

Объект, который объединяет фрагменты текста (указанные в виде массива, Iterable, varargs или даже Map) с разделителем. Он либо добавляет результаты к Appendable, либо возвращает их как String. Пример:

Joiner joiner = Joiner.on("; ").skipNulls();
return joiner.join("Harry", null, "Ron", "Hermione");

Возвращает строку "Harry; Ron; Hermione". Обратите внимание, что все входные элементы преобразуются в строки с использованием Object.toString() перед добавлением.

0 голосов
/ 27 июля 2010

Почему бы не добавить запятую ДО каждого элемента (кроме первого)?Псевдокод:

is_first = true
loop element over element_array
BEGIN LOOP
   if (! is_first)
       print ","
   end if
   print element
   is_first = false
END
print NEWLINE
0 голосов
/ 27 июля 2010

Полагаю, самый простой способ - создать новый массив, содержащий только те элементы из исходного массива, которые вам нужно распечатать (т.е. операция filter). Затем напечатайте вновь созданный массив, предпочтительно используя встроенную в ваш язык функцию array / vector print / join.

(In Perl)

@orig=("a","bc","d","ef","g");
@new_list=();
for $x(@orig){
    push(@new_list,$x) if (length($x)==1);
}
print join(',',@new_list)."\n";

(на Java)

List<String> orig=Arrays.asList(new String[]{"a","bc","d","ef","g"});
List<String> new_list=new ArrayList<String>();
for(String x: orig){
    if (x.length()==1)
        new_list.add(x);
}
System.out.println(new_list);
0 голосов
/ 27 июля 2010

У вас есть несколько вариантов в зависимости от языка.

например, в JavaScript просто сделайте:

var prettyString = someArray.join(', ');

в PHP вы можете implode()

$someArray = array('apple', 'orange', 'pear');
$prettyString = implode(",", $someArray);

если всев противном случае вы можете добавить запятую после каждой записи и обрезать последнюю, когда закончите, или проверить цикл while / foreach (плохо для perf), если это не последний элемент (если да, добавить запятую)

обновление: , поскольку вы отметили Java ... вы можете создать такой метод:

public static String join(String[] strings, String separator) {
  StringBuffer sb = new StringBuffer();
  for (int i=0; i < strings.length; i++) {
    if (i != 0) sb.append(separator);
      sb.append(strings[i]);
  }
  return sb.toString();
}

обновление 2: звучит так, как будто вы действительно этого хотите, тогда, если вы не выводите каждый элемент (псевдокод):

first = true;
for(item in list){
  if(item meets condition){
    if(!first){
      print ", ";
    } else {
      first = false;
    }
    print item;
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...