Если массив простой и порядок имеет значение, поэтому эти две строки могут помочь
//Assume
var a = ['a','b', 'c']; var b = ['a','e', 'c'];
if(a.length !== b.length) return false;
return !a.reduce(
function(prev,next,idx, arr){ return prev || next != b[idx] },false
);
Уменьшить количество проходов по одному из массивов и возвращает «ложь», если хотя бы один элемент из «а» не является ни равно элементу 'b' Просто оберните это в функцию
Ну, у меня было немного свободного времени, поэтому я решил пережить старые добрые дни Linux:]
Прочитав немного об awk и sed, я решил, что может быть лучше использовать оба варианта, поскольку проще добавить отступ в awk и проанализировать строки в sed.
Вот ~ / sed_script, форматирующий исходный файл:
# delete indentation s/^ \+//g # format lines with class s/^\(.\+class.\+\) *\({.*\)$/\1\n\2/g # format lines with methods s/^\(public\|private\)\( \+static\)\?\( \+void\)\? \+\(.\+(.*)\) *\({.*\)$/\1\2\3 \4\n\5/g # format lines with other structures /^\(if\|else\|for\|while\|case\|do\|try\)\([^{]*\)$/,+1 { # get lines not containing '{' # along with the next line /.*{.*/ d # delete the next line with '{' s/\([^{]*\)/\1 {/g # and add '{' to the first line }
А вот ~ / awk_script который добавляет отступ:
BEGIN { depth = 0 } /}/ { depth = depth - 1 } { getPrefix(depth) print prefix $0 } /{/ { depth = depth + 1 } function getPrefix(depth) { prefix = "" for (i = 0; i < depth; i++) { prefix = prefix " "} return prefix }
И вы используете их вот так:
> sed -f ~/sed_script ~/file_to_format > ~/.tmp_sed > awk -f ~/awk_script ~/.tmp_sed
Это далеко не подходящий инструмент форматирования, но я надеюсь, что он подойдет как образец сценария для справки:] Удачи вам в обучении.
Быстрая, ошибочная попытка, но она работает на вашем примере ввода:
BEGIN {depth = 0;}
/{$/ {depth = depth + 1}
/^}/ {depth = depth - 1}
{prefix = ""; for (i = 0; i < depth; i++) { prefix = prefix " "} print prefix $0 ; }
Это сценарий awk: поместите его в файл и выполните
awk -f awk_script_file source_file
Очевидные недостатки этого включают:
Он не распознает места без скобок, где вы хотели бы сделать отступ, например
if (foo)
бар();
Он изменяет глубину отступа на основе фигурных скобок в комментариях и строковых литералах
Думаю, это можно сделать с помощью простого сценария sed. Используйте 1 переменную (bCount), в которой хранится количество '{' (открывающие скобки) - (минус) количество '}' (закрывающие скобки) Затем я просматривал файл и вставлял «вкладки» в соответствии с фактическим количеством используемых скобок. Итак,
public class Super{ //bCount=0
public static void main(String[] args){ //bCount=1
System.out.println("Hello world"); //bCount=2
int a=0; //bCount=2
....and so on
так что вставьте 0 вкладок в строку 0
1 вкладку в строке 1
2 вкладки в строке 3 и 4 и так далее ...
Это определенно возможно ... Я просто не понимаю, зачем вам тратить на это время? :] Для этого достаточно инструментов, и любая достойная IDE предоставляет способ переформатировать исходный код (включая Eclipse).
Например, для форматирования в Eclipse 3.4 (должно быть аналогично в других версиях) просто щелкните правой кнопкой мыши в своем проекте или файле и выберите в меню «Источник> Формат».
И если вам нужно изменить способ форматирования кода, просто перейдите в «Настройки> Java> Стиль кода> Форматирование» и измените шаблон. Насколько мне известно, в JDeveloper и NetBeans он очень похож.
Взгляните на CLI для Jalopy . Jalopy - довольно мощный модуль форматирования исходных файлов.
Рассмотрим с использованием Jindent , который является «простым инструментом java с использованием Emacs». Это бесплатный сценарий оболочки, который является частью проекта PTOLMEA в Беркли.