/**
* Copyright (c) 2005-2017, KoLmafia development team
* http://kolmafia.sourceforge.net/
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* [1] Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* [2] Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
* [3] Neither the name "KoLmafia" nor the names of its contributors may
* be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
package net.sourceforge.kolmafia.utilities;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import net.sourceforge.kolmafia.KoLConstants;
public class KoLDatabase
{
private static class ItemCounter
implements Comparable<ItemCounter>
{
private final int count;
private final String name;
public ItemCounter( final String name, final int count )
{
this.name = name;
this.count = count;
}
public int compareTo( final ItemCounter o )
{
ItemCounter ic = (ItemCounter) o;
if ( this.count != ic.count )
{
return ic.count - this.count;
}
return this.name.compareToIgnoreCase( ic.name );
}
@Override
public String toString()
{
return this.name + ": " + this.count;
}
}
public static final String getBreakdown( final List<String> items )
{
if ( items.isEmpty() )
{
return KoLConstants.LINE_BREAK;
}
StringBuilder strbuf = new StringBuilder();
strbuf.append( KoLConstants.LINE_BREAK );
Object[] itemArray = new Object[ items.size() ];
items.toArray( itemArray );
int currentCount = 1;
ArrayList<ItemCounter> itemList = new ArrayList<ItemCounter>();
for ( int i = 1; i < itemArray.length; ++i )
{
if ( itemArray[ i - 1 ] == null )
{
continue;
}
if ( itemArray[ i ] != null && !itemArray[ i - 1 ].equals( itemArray[ i ] ) )
{
itemList.add( new ItemCounter( itemArray[ i - 1 ].toString(), currentCount ) );
currentCount = 0;
}
++currentCount;
}
if ( itemArray[ itemArray.length - 1 ] != null )
{
itemList.add( new ItemCounter( itemArray[ itemArray.length - 1 ].toString(), currentCount ) );
}
strbuf.append( "<ul>" );
Collections.sort( itemList );
for ( int i = 0; i < itemList.size(); ++i )
{
strbuf.append( "<li><nobr>" + itemList.get( i ) + "</nobr></li>" );
strbuf.append( KoLConstants.LINE_BREAK );
}
strbuf.append( "</ul>" );
strbuf.append( KoLConstants.LINE_BREAK );
return strbuf.toString();
}
/**
* Calculates the sum of all the integers in the given list. Note that the list must consist entirely of Integer
* objects.
*/
public static final long calculateTotal( final List values )
{
long total = 0;
for ( int i = 0; i < values.size(); ++i )
{
if ( values.get( i ) != null )
{
total += ( (Integer) values.get( i ) ).intValue();
}
}
return total;
}
/**
* Calculates the average of all the integers in the given list. Note that the list must consist entirely of Integer
* objects.
*/
public static final float calculateAverage( final List values )
{
return (float) KoLDatabase.calculateTotal( values ) / (float) values.size();
}
}