Jump to content
  • 0

Fastlist Inside Array (Suggestion - Help)


Question

Posted

Hello i made a small event but i made it using FastList and 1 array and it add 2 objects

and it currently no works so i wanted someone add me on skype

and just see the code and suggest me how should i change it.

Thanks!

 

Skype: unst0ppabl32

Recommended Posts

  • 0
Posted (edited)

On a Map, since Java8 you can use putIfAbsent. On a List you still have to check via .contains if an object isn't already registered. If your List contains 2 elements, it means you add twice the element, or you missed the check.

 

FastList got no uses (should be renamed FatList), use either ArrayList or its concurrent version (only if you add/remove in same time, or if you remove iterating it), CopyOnWriteArray.

 

Otherwise, c/p the part of code.

Edited by Tryskell
  • 0
Posted

On a Map, since Java8 you can use putIfAbsent. On a List you still have to check via .contains if an object isn't already registered. If your List contains 2 elements, it means you add twice the element, or you missed the check.

 

FastList got no uses (should be renamed FatList), use either ArrayList or its concurrent version (only if you add/remove in same time, or if you remove iterating it), CopyOnWriteArray.

 

Otherwise, c/p the part of code.

Ill send u the part of code i made cause i dont want share it and i work in java 7 (freya) so take a look in it (i send it now)thanks

  • 0
Posted

I read your code, and I don't find the use of those arrays and lists. Plus, don't use FastList, use CopyOnWriteArrayList.

 

Eventually ask exactly what you want to do, because even on your PM, with your piece of code, it wasn't clear.

 

For the biggest I think I answered correctly, at least it's the easiest/fastest implementation of your idea.

 

You only have to for loop couples to get needed infos.

  • 0
Posted

I read your code, and I don't find the use of those arrays and lists. Plus, don't use FastList, use CopyOnWriteArrayList.

 

Eventually ask exactly what you want to do, because even on your PM, with your piece of code, it wasn't clear.

 

For the biggest I think I answered correctly, at least it's the easiest/fastest implementation of your idea.

 

You only have to for loop couples to get needed infos.

I made an npc instance that when a player click "register" a window pop up to his/her parther (if partner exist and is in range of 500 aoe )

and ask if she/he want to join  if she accept (join) the couple (those 2 players) are added in the event. 

 

A threadpool start and check 5 min if couples > 4  event start... i want do a couple war 

  • 0
Posted

I made an npc instance that when a player click "register" a window pop up to his/her parther (if partner exist and is in range of 500 aoe )

and ask if she/he want to join  if she accept (join) the couple (those 2 players) are added in the event. 

 

A threadpool start and check 5 min if couples > 4  event start... i want do a couple war 

Pretty basic stuff. Don't use the hard way. Take an example from TvT event.

  • 0
Posted

Pretty basic stuff. Don't use the hard way. Take an example from TvT event.

Yeap yeap i know i already coded many events that use 1 object per time but this time is different.. we speak for 2 object rights?

 

L2PcInstance player = null; (1 object)

L2PcInstance partner = L2World.getInstance().getPlayer(player.getPartnerId());

 

_players.add(player);

_players.add(partner);

 

it works but i also want to make a 2nd map that add

those _players into a new  _playerList map

 

and after add them  _players.clear();  so its fresh clean again...

 

the problem i face is i dont know how to handle _playerList map...  there is nothing i can use   exept a For to teleport them but inside the event

there is nothing to control them like    coupleId(1).doDie  and kill both players if 1 of them die... 

  • 0
Posted
final L2PcInstance partner = L2World.getInstance().getPlayer(Couple.getPartnerId(player.getObjectId()));

That's to retrieve the partner, to send your popup (you could simply check wedding manager).

 

Regarding couple management, once again, the easiest is to put booleans flags into Couple class (or an Enum).

 

You for loop couples and retrieve couples with good enum value or good flag value.

 

You got all needed in CoupleManager (getCouples(), getCouple(coupleid), etc).

  • 0
Posted (edited)

Got some tests or infos about it ?

 

No.

 

But basically the javadoc says it all.

 

You got either CopyOnWriteArrayList, which that said :

 

 

 

A thread-safe variant of ArrayList in which all mutative operations (add, set, and so on) are implemented by making a fresh copy of the underlying array.

This is ordinarily too costly.

 

Or a concurrent Set, backed by a ConcurrentHashMap, with all Set properties such as uniqueness. It all depends if he needs to get or not.

Edited by Sdw
  • 0
Posted (edited)

Ooooookkkkk, I was wondering why L2J did that way, and since I ran one little test I understand :P. My code isn't serious and barely be called a test : 100k integers addition, then I Iterator to force concurrency and remove multiples of 2 and 5 (a simple hashset throws a concurrentexception).

 

The only thing which changes from one test to another is the container :

final Set<Integer> map = new CopyOnWriteArraySet<>();
final List<Integer> map = new CopyOnWriteArrayList<>();
final Set<Integer> map = ConcurrentHashMap.newKeySet();

Result is kinda sad :

 

CopyOnWriteArraySet : between 40 and 67sec.

CopyOnWriteArrayList : between 15 and 30sec.

ConcurrentHashMap.newKeySet : between 0,8 and 1,5sec.

 

Don't use CopyOnWriteArrayList nor CopyOnWriteArraySet.

 

I have some commits to do on aCis :P.

 

If you want to test it :

    public static void main(String[] args)
    {
    	 long storedTime = System.currentTimeMillis();
    	 
    	final Set<Integer> map = new CopyOnWriteArraySet<>();
    	
    	//Populate the map.
    	 for (int i = 0 ; i < 100000 ; i++)
    		 map.add(i);
    	 
    	 Iterator<Integer> it = map.iterator();
    	         while(it.hasNext()){
    	        	 Integer value = it.next();
    	             if(value%5 == 0 || value%2 == 0) {
    	            	 System.out.println("skipped:"+value);
    	            	 map.remove(value);
    	             }
    	         }
    	 
    	 long currentTime = System.currentTimeMillis();
    	 System.out.println("map size: " + map.size());
         System.out.println("execution time: " + (currentTime - storedTime));
    }
Edited by Tryskell
  • 0
Posted

 Tryskell the send message window works..  i just dont know how to add 2 objects in 1 array and take them as 1 team

2 players (team1)

2 players (team2)

2 players (team3)

this is what i want to do

and before event start if 1 player click "unregister" it unregister his partner too

  • 0
Posted

public static ArrayList<FastList> couplesList = new ArrayList<>();

public static final FastList<L2PcInstance> _players = new FastList<L2PcInstance>();final L2PcInstance partner = L2World.getInstance().getPlayer(player.getPartnerId());

 

 

 

 

 

 

 


else if (command.startsWith("remove"))

{

 

//=================================================================


if (couplesList.contains(_players))

{

couplesList.remove(_players);

 

player.sendMessage("You removed your participation from event");

partner.sendMessage("Your partner removed the participation from event");

 

setCouples(getCouples() -1);

}

 


 

else if (command.startsWith("join"))

{

 

//=================================================================

 

final L2PcInstance partner = L2World.getInstance().getPlayer(player.getPartnerId());

 

 

_players.add(player);

_players.add(partner);

 

couplesList.add(_players);

 

_players.clear();

 

player.sendMessage("You are registered in the event with your partner");

partner.sendMessage("You are registered in the event with your partner");

 

setCouples(getCouples() + 1);

 

Timer();

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



×
×
  • Create New...