java - Критика кода

377
30 января 2017, 17:03

Привет! Читаю книгу и тут, вообщем, после каждой главы - задания. Вообщем, вот какое.

Пользователь вводит числа через пробелы. Программа должна выводить:

  1. Четные числа

  2. Нечетные числа

  3. Наибольшее число

  4. Наименьшее число

  5. Числа, которые делятся на 3 или на 9 (без остатка)

  6. Числа, которые делятся на 5 и на 7 (без остатка)

  7. Элементы, расположенные методом пузырька по убыванию модулей

  8. Трехзначные числа, в записи которых нет повторяющихся цифр

  9. Наибольший общий делитель

  10. Наименьшее общее кратное

  11. Простые числа

  12. Числа, отсортированные по возрастанию

  13. Числа, отсортированные по убыванию

  14. Числа в порядке убывания частоты встречаемости

Хух. Вообщем, я все это написал, но мне кажется, уж слишком г#внокод. Требуется критика кода :) Представьте, что вы смотрите код на собеседовании.

public class Main
{
static Integer[] bubble;
public static void main(String[] args)
{
    //setup
    System.out.println("Введите числа через пробелы");
    String[] arr = new Scanner(System.in).nextLine().split(" ");
    ArrayList<Integer> ch = new ArrayList<>();
    ArrayList<Integer> unch = new ArrayList<>();
    ArrayList<Integer> ch39 = new ArrayList<>();
    ArrayList<Integer> ch57 = new ArrayList<>();
    ArrayList<Integer> z300 = new ArrayList<>();
    ArrayList<Integer> primes = new ArrayList<>();
    bubble = new Integer[arr.length];
    int min = Integer.parseInt(arr[0]); 
    int lcm = Integer.parseInt(arr[0]);
    int max = Integer.parseInt(arr[0]); 
    int nod = Integer.parseInt(arr[0]);
    //logic
    for (int x = 0; x < arr.length; x++)
    {
        String s = arr[x];
        int i = Integer.parseInt(s);
        bubble[x] = i;
        min = Math.min(min, i);
        max = Math.max(max, i);
        if (Math.abs(i % 2) == 0) ch.add(i);
        else unch.add(i);
        if (i % 3 == 0 || i % 9 == 0) ch39.add(i);
        if (i % 5 == 0 && i % 7 == 0) ch57.add(i);
        if (s.length() == 3)
        {
            String a = s.substring(0, 1);
            String b = s.substring(1, 2);
            String c = s.substring(2, 3);
            if (! a.equals(b) && ! b.equals(c) && ! c.equals(a))
            {
                z300.add(i);
            }
        }
        nod = gcd(nod, i);
        lcm = lcm(lcm, i);
        int b;
        int num;
        for (b = min; b <= max; b++)         
        {             
            int counter = 0;      
            for(num = b; num >= 1; num--)
            {
                if(b % num==0)
                {
                    counter = counter + 1;
                }
            }
            if (counter == 2)
            {
                if(!primes.contains(b))
                primes.add(b);
            }   
        }   
    }
    //unch
    System.out.print("\nНечетные : ");
    for (int unchitem : unch) System.out.print(unchitem + ", ");
    //ch
    System.out.print("\nЧетные : ");
    for (int chitem : ch) System.out.print(chitem + ", ");
    //ch39
    System.out.print("\nДелятся на 3 или 9 : ");
    for (int ch39item : ch39) System.out.print(ch39item + ", ");
    //ch57
    System.out.print("\nДелятся на 5 и 7 : ");
    for (int ch57item : ch57) System.out.print(ch57item + ", ");
    //z300
    System.out.print("\nТрехзначные числа без повторяющихся цифр : ");
    for (int z300item : z300) System.out.print(z300item + ", ");
    sort();
    System.out.print("\nПо возрастанию : ");
    for (int upitem : bubble) System.out.print(upitem + ", ");
    unsort();
    System.out.print("\nПо убыванию : ");
    for (int downitem : bubble) System.out.print(downitem + ", ");
    bubbleSort();
    System.out.print("\nПузырек : ");
    for (int bubbleitem : bubble) System.out.print(bubbleitem + ", ");
    final ArrayList<Integer> array = new ArrayList<>(Arrays.asList(bubble));
    Collections.sort(array, new Comparator<Integer>() {
            @Override
            public int compare(Integer lhs, Integer rhs) {
                int compareFreq = Collections.frequency(array, rhs) - Collections.frequency(array, lhs);
                return compareFreq != 0 ?
                    compareFreq :
                    rhs - lhs;
            }
        });
    System.out.print("\nЧисла в порядке убывания встречаемости : ");
    for (int primesitem : array) System.out.print(primesitem + ", ");
    System.out.print("\nПростые числа : ");
    for (int primesitem : primes) System.out.print(primesitem + ", ");

    //min & max & nod & nok
    System.out.println("\nМинимальное число: " + min);
    System.out.println("Максимальное число: " + max);
    System.out.println("Наибольший общий делитель: " + nod);
    System.out.println("Наименьшее общее кратное: " + lcm);
}
public static int gcd(int a, int b)
{
    if (b == 0) return Math.abs(a);
    return gcd(b, a % b);
}
public static int lcm(int a,int b){
    return a / gcd(a,b) * b;
}
public static void bubbleSort()
{
    for (int i=bubble.length - 1;i > 0;i--)
    {
        for (int j = 0;j < i;j++)
        {
            if (Math.abs(bubble[j]) <= Math.abs(bubble[j + 1]))
            {
                int tmp=bubble[j];
                bubble[j] = Math.abs(bubble[j + 1]);
                bubble[j + 1] = Math.abs(tmp);
            }
        }
    }
}   
public static void sort()
{
    for (int i = bubble.length - 1; i > 0; i--)
    {
        for (int j = 0; j < i; j++)
        {
            if (bubble[j] >= bubble[j + 1])
            {
                int tmp = bubble[j];
                bubble[j] = bubble[j + 1];
                bubble[j + 1] = tmp;
            }
        }
    }
}
public static void unsort()
{
    for (int i = bubble.length - 1; i > 0; i--)
    {
        for (int j = 0; j < i; j++)
        {
            if (bubble[j] < bubble[j + 1])
            {
                int tmp=bubble[j];
                bubble[j] = bubble[j + 1];
                bubble[j + 1] = tmp;
            }
        }
    }
}

UPD

Как мог упростил.

public class Main
{
public static ArrayList<Integer> nums;
public static void main(String[] args)
{
    System.out.println("Введите числа через пробелы");
    String[] arr = new Scanner(System.in).nextLine().split(" ");
    nums = new ArrayList<>();
    //перевод в Integer
    for (String str : arr)
    {
        nums.add(Integer.parseInt(str));
    }
    //создаем списки
    ArrayList<Integer> ch, unch, ch39, ch57, z300, primes;
    ch = new ArrayList<>(); //для четных
    unch = new ArrayList<>(); //для нечетных
    ch39 = new ArrayList<>(); //для делимых на 3 или 9
    ch57 = new ArrayList<>(); //для делимых на 5 и 7
    z300 = new ArrayList<>(); //для трехзначных без повторений цифр
    primes = new ArrayList<>(); //для простых
    int first = nums.get(0);
    int min = Collections.min(nums);
    int max = Collections.max(nums);
    int nod = first;
    int lcm = first;
    for (Integer i : nums)
    {
        String s = "" + i;
        if (Math.abs(i % 2) == 0) ch.add(i);
        else unch.add(i);
        if (i % 3 == 0 || i % 9 == 0) ch39.add(i);
        if (i % 5 == 0 && i % 7 == 0) ch57.add(i);
        if (s.length() == 3)
        {
            String a = s.substring(0, 1);
            String b = s.substring(1, 2);
            String c = s.substring(2, 3);
            if (! a.equals(b) && ! b.equals(c) && ! c.equals(a))
            {
                z300.add(i);
            }
        }
        nod = nod(nod, i);
        lcm = nok(lcm, i);
        for(int r =2; r <= i/2; r++)
        {
            if(i % r != 0)
            {
                primes.add(i);
                break;
            }
        }
    }
    output("Четные", ch);
    output("Нечетные", unch);
    output("Делятся на 3 или 9", ch39);
    output("Делятся на 5 и 7", ch57);
    output("Трехзначные числа без повторяющихся цифр", z300);
    output("Простые числа", primes);
    //сортируем по возрастанию
    sort(false);
    output("По убыванию", nums);
    //переворачиваем список и получаем список по возрастанию
    Collections.reverse(nums);
    output("По возрастанию", nums);
    //сортируем по частоте встречаемости
    Collections.sort(nums, new Comparator<Integer>() {
            @Override
            public int compare(Integer lhs, Integer rhs)
            {
                int compareFreq = Collections.frequency(nums, rhs) - Collections.frequency(nums, lhs);
                return compareFreq != 0 ? compareFreq : rhs - lhs;
            }
    });
    output("Числа в порядке убывания встречаемости", nums);
    //сортируем по убыванию модулей
    sort(true);
    output("По убыванию модулей", nums);
    System.out.println("\nМинимальное число: " + min);
    System.out.println("Максимальное число: " + max);
    System.out.println("Наибольший общий делитель: " + nod);
    System.out.println("Наименьшее общее кратное: " + lcm);
}
public static int nod(int a, int b)
{
    if (b == 0) return Math.abs(a);
    return nod(b, a % b);
}
public static int nok(int a, int b)
{
    return a / nod(a, b) * b;
}
public static void sort(boolean bubble)
{
    if(bubble) {
    for(int b = 0; b < nums.size(); b++)
    nums.set(b, Math.abs(nums.get(b)));
    }
    Collections.sort(nums, new Comparator<Integer>() {
            @Override
            public int compare(Integer lhs, Integer rhs)
            {
                if(rhs > lhs) return 1;
                else if(rhs < lhs) return -1;
                else return 0;
            }
    });
}   
public static void output(String text, List<Integer> list){
    System.out.print("\n" + text + " : ");
    for (int i : list) System.out.print(i + ", ");
}
READ ALSO
Garbage Collector в неуправляемом коде

Garbage Collector в неуправляемом коде

Если я создам массив байт, например, и передам указатель на него в неуправляемый код, что с этим массивом будет делать Garbage Collector?

300
Android Support Library

Android Support Library

Доброго времени сутокВозникла такая проблема, что в eclipse всё время вылезает ошибка:

360
java - Почему рекурсия так плоха?

java - Почему рекурсия так плоха?

ИнтересноПочему рекурсия это плохо? Ведь это тот же самый цикл, даже более того, с возможностью передачи параметров

500
Определить количество обратных слешей

Определить количество обратных слешей

Как в пути (например, d:\\WrkFld\\JJJ\\Адреса или d:\WrkFld\JJJ\Адреса) определить количество обратных слешей (\\ или \)?

286