Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Java программирование > Общие вопросы по Java, Java SE, Kotlin
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.09.2014, 21:22   #1
_Kor__
Новичок
Джуниор
 
Регистрация: 04.12.2013
Сообщений: 2
Счастье Работаем с массивами и временем!

Здравствуйте, уважаемые форумчане!

Разбираюсь с такой программулиной: Есть ввод, вводим числа/строки, они сразу добавляются в массив, если мы вводим новую строку( которой нет в массиве) то через 2 секунды должна вывестись строка ('элемент удален') Если мы вводим строку, которая уже есть в массиве, то срока элемент удален выведется уже через 4 секунды, и т д... Приведу примреный вывод программы:

Код:
1
прошло 2 секунды
элемент удален
2
2
прошло 4 секунды
элемент удален
1
1
прошло 4 секунды
элемент удален
3
3
2
2
прошло 4 секунды
элемент удален
прошло 4 секунды
элемент удален
Есть примерные начинания:
Код:
import java.util.HashMap;
import java.util.Scanner;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class Neuro {
	private ExecutorService es = Executors.newCachedThreadPool();
	public HashMap<Object, Object> strhash = new HashMap<Object, Object>();

	public void add(Object elem) {
		FutureDeleter newfd = new FutureDeleter(elem);
		if (strhash.containsKey(elem)) {
			FutureDeleter f = (FutureDeleter) strhash.get(elem);
			f.cancel();
			newfd.delay = f.delay * 2;
		}
		es.submit(newfd);
		
		String[] elems = new String[4];
		elems[0] = "1";
		elems[1] = elem;
		elems[2] = "1";
		elems[3] = "1";
		strhash.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) {
					strhash.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(String.valueOf(nxt)); 
		}
	}
}
вместе со строкой я буду добавлять некоторые свойства(циферки 1 в массиве..)

Помогите, пожалуйста, решить эту задачу!
_Kor__ вне форума Ответить с цитированием
Старый 12.09.2014, 06:57   #2
BleStaR
Форумчанин
 
Регистрация: 25.09.2009
Сообщений: 234
По умолчанию

Вот для примера... конечно тут будут отличия небольшие от реального времени (задержка на indexOf). Но думаю для данной задачи не критично.
Код:
package programmersforum;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import javax.swing.Timer;

public class Neuro {
    
    private static final Timer ADD_NEW_TIMER = new Timer(2000, e -> {
        System.out.println(String.format("%s\n%s\n", "Прошло 2 секунды", "Элемент удален"));
        ((Timer)e.getSource()).stop();
    });
    private static final Timer ADD_OLD_TIMER = new Timer(4000, e -> {
        System.out.println(String.format("%s\n%s\n", "Прошло 4 секунды", "Элемент удален"));
        ((Timer)e.getSource()).stop();
    });
    
    
    private final List<String> data = new ArrayList<>();
    
    public void add(String s) {
        
        if ( data.indexOf(s) == -1 ) {
            ADD_NEW_TIMER.start();
            data.add(s);
        } else {
            ADD_OLD_TIMER.start();
        }
    }
    
    public static void main(String [] args) {
        Scanner scan = new Scanner(System.in);
        Neuro shm = new Neuro();

        while (true) {
                String nxt = scan.next();
                shm.add(String.valueOf(nxt));
                try {
                    Thread.sleep(100);
                } catch (InterruptedException ex) {}
        }
    }
}
BleStaR вне форума Ответить с цитированием
Старый 12.09.2014, 10:21   #3
_Kor__
Новичок
Джуниор
 
Регистрация: 04.12.2013
Сообщений: 2
По умолчанию

BleStaR, спасибо! Не особо критично, да))

А можно попросить вас сделать чуть чуть по другому?)

Вот мы при добавлении как бы запускаем таймер..Если мы успеем ввести тот же элемент, то время таймера увеличивается на две единицы.

А мы должны действовать примерно так:

Добавили 1, счетчик пошел на две секунды, успели в эти две секунды еще раз ввести 1, то время уже равно 4 секундам, успели еще раз ввести 1, то время увеличивается - 8 и т д 16 32.

Помогите, пожалуйста, вот это реализовать)
_Kor__ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работаем в сети с помощью libcurl oleg kutkov C/C++ Сетевое программирование 27 16.08.2018 23:09
статья - Работаем в сетью с помощью libcurl Pblog Обсуждение статей 0 16.09.2013 02:46
Работаем с COM-портом dab00 WPF, UWP, WinRT, XAML 0 18.02.2011 12:18
Работаем с фильтром... nikolai_P Microsoft Office Excel 7 13.03.2009 14:04
Работаем с РЕЕСТРОМ Altera Windows 7 12.02.2008 18:53