/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.jena.atlas.lib;
import static java.util.Arrays.stream;
import static java.util.stream.Collectors.joining;
import java.util.ArrayList ;
import java.util.List ;
import java.util.stream.Collectors ;
import java.util.stream.Stream ;
import org.apache.jena.atlas.io.IndentedWriter ;
import org.apache.jena.atlas.logging.Log ;
/** Various things for lists */
public class ListUtils
{
private ListUtils() {}
public static <T>
List<T> unique(List<T> list)
{
return toList(list.stream().distinct()) ;
}
public static
List<Integer> asList(int... values)
{
List<Integer> x = new ArrayList<>(values.length) ;
for ( int v : values )
x.add(v) ;
return x ;
}
// This is commonly needed
public static <T> List<T> toList(Stream<T> stream) {
return stream.collect(Collectors.toList()) ;
}
public static <T> String str(T[] array)
{
return stream(array).map(String::valueOf).collect(joining(", ", "[", "]"));
}
public static String str(int[] array)
{
return stream(array).mapToObj(String::valueOf).collect(joining(", ", "[", "]"));
}
public static String str(long[] array)
{
return stream(array).mapToObj(String::valueOf).collect(joining(", ", "[", "]"));
}
public static <T> void print(IndentedWriter out, List<T> list)
{
print(out, list, " ") ;
}
public static <T> void print(final IndentedWriter out, List<T> list, final CharSequence sep)
{
out.print(list.stream().map(String::valueOf).collect(joining(sep)));
}
/**
* Compare two lists, same elements, order of the lists may be different, elements
* must have the same cardinality.
*/
public static <T> boolean equalsUnordered(List<T> list1, List<T> list2) {
if ( list1.size() != list2.size() )
return false ;
// containsAll bothe ways round isn't enough.
List<T> list2a = new ArrayList<>(list2) ;
for ( T elt : list1 )
list2a.remove(elt) ;
if ( list2a.size() != 0 )
return false ;
return true ;
}
/** Return a list of lists of all the elements of collection in every order
* Easy to run out of heap memory.
*
* See also {@code org.apache.jena.ext.com.google.common.collect.Collections2#permutations}
*/
static public <T> List<List<T>> permute(List<T> c)
{
if ( c.size() > 5 )
{
Log.warn(ListUtils.class, "Attempt to permute more than 5 items - think again") ;
return null ;
}
List<List<T>> x = new ArrayList<>() ;
if ( c.size() == 1 )
{
x.add(c) ;
return x ;
}
for ( T obj : c )
{
List<T> c2 = new ArrayList<>(c) ;
c2.remove(obj) ;
List<List<T>> x2 = permute(c2) ;
// For each list returned
for ( List<T> x3 : x2 )
{
// Gives a more expected ordering
x3.add(0,obj) ;
x.add(x3) ;
}
}
return x ;
}
}