Написал программу. Программа выполняет все поставленные задачи, кроме одной, она должна выполнятся за 1 секунду, но выполняется за 4, подскажите, пожалуйста, в чём причина:
import java.util.*;
public class Main {
long startTime = System.currentTimeMillis();
public static void main(String[] args) {
Main main1 = new Main();
System.out.println("Введите pin-код:");
ArrayList list = main1.sort();
for (int i=0;i<list.size();i++){
System.out.print(list.get(i));
if (i<list.size()-1) System.out.print(",");
}
System.out.println();
main1.se();
}
public String input(){ //Ввод числа и проверка на соответствие условию
Scanner scanner = new Scanner(System.in);
String print = "123456789";
char ch [] = {1,2,3,4,5,6,7,8,9};
while (print.length()>8){
print = scanner.nextLine();
if (print.length()>8){
System.out.println("Введите число длиной от 1 до 8 знаков:");
}
}
return print;
}
public String [] mass(String number){ //Разбиение числа на составные части и занесение в массив
int ch [] = new int[number.length()];
for (int i = 0; i < number.length(); i++)
{
ch[i] = number.charAt(i) - '0';
}
String [] arrStr = new String[ch.length];
for (int i=0; i<ch.length; i++){
arrStr[i]=ch[i]+"";
}
return arrStr;
}
public String [] arrays(String a){ //Все возможные замены каждого числа
if (a.equals(1+"")){
String arr[] = {1+"",2+"",4+""};
return arr;
}
else if (a.equals(2+"")){
String arr[] = {2+"",1+"",5+"",3+""};
return arr;
}
else if (a.equals(3+"")){
String arr [] = {3+"",2+"",6+""};
return arr;
}
else if (a.equals(4+"")){
String arr [] = {4+"",1+"",5+"",7+""};
return arr;
}
else if (a.equals(5+"")){
String arr [] = {5+"",2+"",4+"",6+"",8+""};
return arr;
}
else if (a.equals(6+"")){
String arr [] = {6+"",3+"",5+"",9+""};
return arr;
}
else if (a.equals(7+"")){
String arr [] = {7+"",4+"",8+""};
return arr;
}
else if (a.equals(8+"")){
String arr [] = {8+"",7+"",5+"",9+"",0+""};
return arr;
}
else if (a.equals(9+"")){
String arr [] = {9+"",6+"",8+""};
return arr;
}
else if (a.equals(0+"")){
String arr [] = {0+"",8+""};
return arr;
}
else {
String arr [] = {0+"",8+""};
return arr;
}
}
public String [] merger (String [] arr, String [] arr2){
String mass [] = new String[arr.length*arr2.length];
int b = 0;
for (int i = 0; i<arr.length;i++){
for (int j = 0; j<arr2.length;j++){
mass[b]= arr[i]+arr2[j];
b++;
}
}
return mass;
}
public String [] combinations(String [] arr){ //Составление комбинаций чисел (возможных pin-кодов)
String arrStr [] = new String[arr.length];
for (int i=0; i<arrStr.length; i++){
arrStr[i]=arr[i]+"";
}
String mass1 [] = arrays(arr[0]);
if (arr.length>7){
String [] line = merger(merger(merger(merger(merger(merger(merger(mass1,arrays(arr[1])),arrays(arr[2])),arrays(arr[3])),arrays(arr[4])),arrays(arr[5])),arrays(arr[6])),arrays(arr[7]));
return line;
}
else if (arr.length>6){
String [] line = merger(merger(merger(merger(merger(merger(mass1,arrays(arr[1])),arrays(arr[2])),arrays(arr[3])),arrays(arr[4])),arrays(arr[5])),arrays(arr[6]));
return line;
}
else if (arr.length>5){
String [] line = merger(merger(merger(merger(merger(mass1,arrays(arr[1])),arrays(arr[2])),arrays(arr[3])),arrays(arr[4])),arrays(arr[5]));
return line;
}
else if (arr.length>4){
String [] line = merger(merger(merger(merger(mass1,arrays(arr[1])),arrays(arr[2])),arrays(arr[3])),arrays(arr[4]));
return line;
}
else if (arr.length>3){
String [] line = merger(merger(merger(mass1,arrays(arr[1])),arrays(arr[2])),arrays(arr[3]));
return line;
}
else if (arrStr.length>2){
String [] line = merger(merger(mass1,arrays(arr[1])),arrays(arr[2]));
return line;
}
else if (arrStr.length>1) {
String[] line = merger(mass1, arrays(arr[1]));
return line;
}
return mass1;
}
public ArrayList sort(){ //Сортировка массива комбинаций
ArrayList list = new ArrayList();
String [] mass = combinations(mass(input()));
for (int i = 0; i<mass.length;i++){
list.add(mass[i]);
}
Collections.sort(list);
return list;
}
public void se(){
long time = System.currentTimeMillis() - startTime;
System.out.println(time);
}
}
Вам слово рефакторинг знакомо? Программа работает медленно из-за создания огромного количества стринговых объектов. Немного подправил код, он сократился в 2,5 раза. Кроме того, убрал ненужные конкатинации, использовал джойнер для стрингов и паралельную сортировку. Теперь это работает в два раза быстрее, что, разумеется, не предел. Дальше уже своими силами) Удачи
import java.util.*;
public class Main {
public static void main(String[] args) {
Main main1 = new Main();
System.out.println("Введите pin-код:");
String userInput = main1.input();
long startTime = System.currentTimeMillis();
List<String> list = main1.combinations(userInput);
System.out.println(list);
System.out.println();
long time = System.currentTimeMillis() - startTime;
System.out.println(time);
}
public String input() { //Ввод числа и проверка на соответствие условию
final Scanner scanner = new Scanner(System.in);
while (true) {
System.out.println("Введите число длиной от 1 до 8 знаков:");
String input = scanner.nextLine();
try {Integer.valueOf(input);
} catch (NumberFormatException e) {continue;}
if (input.length()>8) continue;
return input;
}
}
private String[] arrays(String a) { //Все возможные замены каждого числа
switch (a) {
case "1": return new String[] {"1", "2", "4"};
case "2": return new String[] {"2", "1", "5", "3"};
case "3": return new String[] {"3", "2", "6"};
case "4": return new String[] {"4", "1", "5", "7"};
case "5": return new String[] {"5", "2", "4", "6", "8"};
case "6": return new String[] {"6", "3", "5", "9"};
case "7": return new String[] {"7", "4", "8"};
case "8": return new String[] {"8", "7", "5", "9", "0"};
case "9": return new String[] {"9", "6", "8"};
case "0": return new String[] {"0", "8"};
default: return new String[] {"0", "8"};
}
}
private String[] merger(final String[] arr, final String[] arr2) {
final List<String> list = new ArrayList<>(arr.length*arr2.length);
for (final String arr1 : arr) {
for (String arr21 : arr2) {
list.add(String.join("", arr1,arr21));
}
}
return list.toArray(new String[list.size()]);
}
public List<String> combinations(String userInput) { //Составление комбинаций чисел (возможных pin-кодов)
String[] prev = null;
for (String s : userInput.split("")) {
String[] mass1 = arrays(s);
if (prev == null) {
prev = mass1;
continue;
}
prev = merger(prev, mass1);
}
Arrays.parallelSort(prev);
return Arrays.asList(prev);
}
}
Виртуальный выделенный сервер (VDS) становится отличным выбором
У меня такой вопрос, как разобрать json с неизвестным ключом? https://acxio//api/v2/tickers
Всем добрый день! В общем не знаю, сможет ли кто помочь, так как вопрос сложный и объёмный, но все же отпишусьПошел я на курсы по java, знания базовой...
Начал свое знакомство с Realm и столкнулся с проблемой что такие классы как Calendar и Drawable не поддерживаются Realm, оно и логичноCalendar я стал хранить...