Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Методы работы с временем! / 20 сообщений из 20, страница 1 из 1
17.09.2014, 14:29
    #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
17.09.2014, 16:08
    #38749346
DDiver
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Методы работы с временем!
Sergeyyy,

вам что нужно-то? постановка задачи просто вырви глаз
...
Рейтинг: 0 / 0
17.09.2014, 16:32
    #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
17.09.2014, 19:50
    #38749658
DDiver
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Методы работы с временем!
Sergeyyy,

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

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

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

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

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

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

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

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

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

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

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

DDiver, не, для себя пишу.
...
Рейтинг: 0 / 0
17.09.2014, 22:16
    #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
17.09.2014, 22:26
    #38749791
Sergeyyy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Методы работы с временем!
DDiver,
Вы не человек, вы ЧЕЛОВЕЧИЩЕ! Огромное спасибо, именно тот функционал что нужен! Прям конфетка!

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

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

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

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

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

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

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

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


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