powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Методы работы с временем!
20 сообщений из 20, страница 1 из 1
Методы работы с временем!
    #38749173
Sergeyyy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!

Возникли проблемки с решением трудной задачки..

Суть задачки такова:

Есть массив(Обычный String[]) В него мы добавляем элементы, дальше идет проверка, если строка которую мы ввели не существует в массиве, то через 2 секунды должно вывестись, допустим, "элемент удален", если строка уже есть в массиве, то выведем строку уже через 4 секунды, если мы еще раз введем строку , то выведем строку элемент удален уже через 8 секунд и т д,16 32...

Вы наверняка уже представили себе такой, примерный вывод программы:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
Введите строки:
м
"элемент м удален 2 секунды"
м
"элемент м удален 4 секунды"
и
т
"элемент и удален 2 секунды"
"элемент т удален 2 секунды"



Но вся соль в том, что если мы в промежуток этих двух секунд успеем ввести опять ту же строку, то предыдущая строка с удалением не выводится, то есть вывод примерно таков:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Введите строки:
м
м
м
"элемент м удален 8 секунд"
с
"элемент с удален 2 секунды"
т
т
ч
ч
"элемент т удален 4 секунды"
"элемент ч удален 4 секунды"




Вот какие-то попытки написать подобный функционал:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
 
public class Neuro {
    static final int N=10;
    static String[] testhim = new String[N];
    public static ExecutorService es = Executors.newCachedThreadPool();
 
    public static void main(String[] args) {
        for (int i = 0; i < N; i++) {
            testhim[i] = "";
        }
        
        Scanner scan = new Scanner(System.in);
        int i = 0;
        
        String nxt;
        Delete f;
        List<Delete> delets = new ArrayList();
        
        while (true) {
            nxt = scan.next();
            
            f = new Delete(nxt);
            int temp=-1;
            if ( (temp=delets.indexOf(f)) != -1) {
                f = delets.get(temp);
            } else {
                delets.add(f);
            }
            
            boolean isAddCurrentString = true;
            for (int counter = 0; counter < N; ++counter) {
                
                if (testhim[counter].equals(nxt)) {
                     System.out.println("Changing delay: " + f.delay);
                    f.cancel();
                    f.delay = f.delay * 2;
                    f.cancel();
                    System.out.println("Changed delay: " + f.delay);
                    f.run();
                    isAddCurrentString = false;
                    break;
                } else {
                    System.out.println("Not changing delay: " + f.delay);
                }
            }
            
            if (isAddCurrentString) {
                Delete newfd = new Delete(nxt);
                es.submit(newfd);
                add(nxt, i++);
            }
        }
    }
 
    public static class Delete implements Runnable {
        volatile int delay = 2;
        volatile boolean cancel;
        String elem;
 
        public String getElem() {
            return this.elem;
        }
        
        public Delete(String elem) {
            this.elem = elem;
        }
 
        public void cancel() {
            cancel = true;
        }
 
        public void upsr() {
            System.out.println(delay + " delay int upsr");
            delay = delay * 2;
            System.out.println(delay + " delay int upsr 2");
        }
 
        @Override
        public void run() {
            try {
                System.out.println(delay + " run delay");
                Thread.sleep(delay * 1000);
                if (!cancel) {
                    System.out.println(delay + " run delay 2 if");
                    System.out.println(" " + elem + " deleted after " + delay
                            + "sec");
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        
        @Override
        public boolean equals(Object obj) {
            if (obj == null || !(obj instanceof Delete)) {
                return false;
            }
            return this.elem.equals(((Delete)obj).elem);
        }
        
    } 
    
    public static void add(String nxt, int i) {
        testhim[i] = nxt;
    }
}




Ну и вторая попытка:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
import java.util.HashMap;
import java.util.Scanner;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
 
public class Neuro extends HashMap<Object, Object> {
    private static final long serialVersionUID = 1L;
    private ExecutorService es = Executors.newCachedThreadPool();
 
    public void add(Object elem) {
        FutureDeleter newfd = new FutureDeleter(elem);
        if (containsKey(elem)) {
            FutureDeleter f = (FutureDeleter) get(elem);
            f.cancel();
            newfd.delay = f.delay * 2;
        }
        es.submit(newfd);
        put(elem, newfd);
    }
 
    class FutureDeleter implements Runnable {
        int delay = 2;
        volatile boolean cancel;
        Object elem;
 
        public FutureDeleter(Object elem) {
            this.elem = elem;
        }
 
        public void cancel() {
            cancel = true;
        }
 
        @Override
        public void run() {
            try {
                Thread.sleep(delay * 1000);
                if (!cancel) {
                    remove(elem);
                    System.out.println(" " + elem + " deleted after " + delay + " seconds");
                }
            } catch (Exception e) {
            }
        }
    }
 
    public static void main(String... args) {
        Scanner scan = new Scanner(System.in);
        Neuro shm = new Neuro();
        while (true) {
            String nxt = scan.next();
            shm.add(nxt);
            System.out.print("              ");
            for (Object o : shm.keySet()) {
                System.out.print(o + "(delay="
                        + ((FutureDeleter) shm.get(o)).delay + ")  ");
            }
            System.out.println();
        }
    }
}




Гуру, Java, помогите, пожалуйста!)

С уважением ваш - Sergeyyy
...
Рейтинг: 0 / 0
Методы работы с временем!
    #38749346
DDiver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergeyyy,

вам что нужно-то? постановка задачи просто вырви глаз
...
Рейтинг: 0 / 0
Методы работы с временем!
    #38749394
Sergeyyy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DDiver, Переделать код под условия)
А точнее вот этот код:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class NeurS {
	static final int N = 10;
	static String[] testhim = new String[N];
	public static ExecutorService es = Executors.newCachedThreadPool();

	public static void main(String[] args) {
		for (int i = 0; i < N; i++) {
			testhim[i] = "";
		}

		Scanner scan = new Scanner(System.in);
		int i = 0;

		String nxt;
		Delete f;
		List<Delete> delets = new ArrayList<Delete>();

		while (true) {
			nxt = scan.next();

			f = new Delete(nxt);
			int temp = -1;
			if ((temp = delets.indexOf(f)) != -1) {
				f = delets.get(temp);
			} else {
				delets.add(f);
			}

			boolean isAddCurrentString = true;
			for (int counter = 0; counter < N; ++counter) {
				if (testhim[counter].equals(nxt)) {
					f.cancel();
					f.delay = f.delay * 2;
					f.cancel();
					f.run();
					isAddCurrentString = false;
					break;
				} else {

				}
			}

			if (isAddCurrentString) {
				Delete newfd = new Delete(nxt);
				es.submit(newfd);
				add(nxt, i++);
			}
		}
	}

	public static class Delete implements Runnable {
		volatile int delay = 2;
		volatile boolean cancel;
		String elem;

		public Delete(String elem) {
			this.elem = elem;
		}

		public void cancel() {
			cancel = (cancel == true) ? false : true;
		}

		public void upsr() {
			delay = delay * 2;
		}

		@Override
		public void run() {
			try {
				Thread.sleep(delay * 1000);
				if (!cancel) {
					System.out.println(" " + elem + " deleted after " + delay
							+ "sec");
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}

		@Override
		public boolean equals(Object obj) {
			if (obj == null || !(obj instanceof Delete)) {
				return false;
			}
			return this.elem.equals(((Delete) obj).elem);
		}

	}

	public static void add(String nxt, int i) {
		testhim[i] = nxt;
	}
}



Сейчас вывод этого кода такой:
Код: java
1.
2.
3.
4.
5.
6.
1
1
 1 deleted after 2sec
 1 deleted after 4sec
2
 2 deleted after 2sec




Видите я два раза ввел единичку, время должно было стать 4 секунды, но мне выводится почему-то 1 deleted after 2sec, а должно выводится только последнее, то есть 1 deleted after 4sec, то есть когда мы несколько раз вводим один и тот же элемент у нас как бы предыдущий вызов метода блокируется( чтобы 1 deleted after 2sec не выводилось)
...
Рейтинг: 0 / 0
Методы работы с временем!
    #38749658
DDiver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergeyyy,

объясните смысл этих операций. Что вы хотите написать? Может это уже сделано до вас. Похоже на кэш какой-то, с временем жизни.
...
Рейтинг: 0 / 0
Методы работы с временем!
    #38749673
Sergeyyy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DDiver,

Не, такого нет. Это, скажем так, временной алгоритм памяти(в виде массива).Ну или изменяющийся со временем массив. Вот как бы код подкорректировать еще..
...
Рейтинг: 0 / 0
Методы работы с временем!
    #38749720
smackmychi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Sergeyyy,

И что вам мешает организовать хранение пары <удаленная строка, время удаления>?
...
Рейтинг: 0 / 0
Методы работы с временем!
    #38749725
Sergeyyy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
smackmychi,

да черт его знает как так сделать, хотелось бы и от кода, который выше, не очень далеко уходить..
...
Рейтинг: 0 / 0
Методы работы с временем!
    #38749731
DDiver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergeyyy,

а для чего такое может понадобиться? может как-то иначи посмотреть на проблему
...
Рейтинг: 0 / 0
Методы работы с временем!
    #38749733
Sergeyyy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DDiver,

Надо именно такой функционал, да много где вообще-то, если присмотреться)
...
Рейтинг: 0 / 0
Методы работы с временем!
    #38749740
smackmychi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Sergeyyy,

Если так, то добавьте поле времени удаления в классе Delete.

Другой вопрос - для чего вам при удалении отсчитывать 2^n секунд.
...
Рейтинг: 0 / 0
Методы работы с временем!
    #38749762
DDiver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergeyyy,

очень на лабу смахивает
...
Рейтинг: 0 / 0
Методы работы с временем!
    #38749780
Sergeyyy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
smackmychi,

Пардон, не совсем понял, что вы написали

Тут не при удалении отсчитывать, а при повторном введении элемента, ввели много раз 1, то строка "элемнет удален выведется через n секунд. А удаление здесь нужно для того, чтобы при выводе строки "элемент удален через скока-то секунд" мы могли бы вывести стандартную строку "элемент удален через 2 секунды" Если, конечно, мы опять не введем за эти 2 секунды это символ...

DDiver, не, для себя пишу.
...
Рейтинг: 0 / 0
Методы работы с временем!
    #38749783
DDiver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergeyyy,
вот похож на ваш код :)

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
public class Neuro {

    public static ExecutorService es = Executors.newCachedThreadPool();
    public static Map<String,Runner> array = Collections.synchronizedMap(new HashMap<String,Runner>());

    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        while (true) {
            String nxt = scan.next();
            Runner obj = array.get(nxt);
            Runner runner;
            if(obj!=null) {
                obj.future.cancel(true);
                int factor = obj.factor;
                factor *=2;
                runner = new Runner(factor,nxt);
            } else {
                runner = new Runner(2,nxt);
            }
            array.put(nxt,runner);
            runner.future = es.submit(runner);
        }
    }

    private static class Runner implements Runnable {
        private Future future;
        private final int time = 1000;
        private int factor;
        private String element;

        private Runner(int factor, String element) {
            this.factor = factor;
            this.element = element;
        }

        @Override
        public void run() {
            try {
                Thread.sleep(factor*time);
                Neuro.array.remove(element);
                System.out.println(element+" removed "+factor+" seconds");
            } catch (InterruptedException e) {
                //e.printStackTrace();
            }
        }
    }
}
...
Рейтинг: 0 / 0
Методы работы с временем!
    #38749791
Sergeyyy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DDiver,
Вы не человек, вы ЧЕЛОВЕЧИЩЕ! Огромное спасибо, именно тот функционал что нужен! Прям конфетка!

Вот если бы не ложечка дегтя..Я со строкой хотел добавлять, скажем так подстроки, Допустим добавляем строку, а с ней несколько строк единичек, по этому для этой задачи я и хотел использовать двумерный массив String, дескать [1][0] = сама строка [1][1] = "1" Вот как бы тут придумать такой механизм..
...
Рейтинг: 0 / 0
Методы работы с временем!
    #38751030
Sergeyyy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DDiver ,

Или так уже не сделать?) Может попробовать вложить в хэш мап еще один хэш мап, с делитом и хэшсетом, с нужными мне стрингами?
...
Рейтинг: 0 / 0
Методы работы с временем!
    #38751045
smackmychi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Sergeyyy,

А можно пример применения данного кода?
...
Рейтинг: 0 / 0
Методы работы с временем!
    #38751054
Sergeyyy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
smackmychi,

Пока примеров нет, пока верхнюю проблему не решим.. А потом я покажу применение.
...
Рейтинг: 0 / 0
Методы работы с временем!
    #38751090
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SergeyyyПока примеров нет, пока верхнюю проблему не решим.. А потом я покажу применение.Лично мне известен только один случай, когда мирное предложение родило спрос. Это эпизод с обувным магазином в новелле "Короли и капуста".

P.S. Пока нет решения, примеры применения существуют в виде проблемы.
Какую проблему вы собрались решать?
...
Рейтинг: 0 / 0
Методы работы с временем!
    #38751144
DDiver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergeyyy,

добавить поля в Runner религия не позволяет? Конечно если очень хочется можете и мапами всё утыкать…
...
Рейтинг: 0 / 0
Методы работы с временем!
    #38751539
Sergeyyy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DDiver,

Дескать - runner = new Runner(factor,nxt);

Просто строк надобавлять? (f1,f2,f3,nxt)
Ну и в самом рунеере обработчик..
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Методы работы с временем!
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]