All Downloads are FREE. Search and download functionalities are using the official Maven repository.

me.zzp.util.Seq Maven / Gradle / Ivy

There is a newer version: 2.3
Show newest version
package me.zzp.util;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;

/**
 * 数组和List相关的工具方法。
 * 
 * @since 1.0
 * @author redraiment
 */
public final class Seq {
  /**
   * 将一系列对象组装成数组。
   * 
   * @param  元素类型。
   * @param args 多个同类型的元素。
   * @return 返回由这些元素组成的数组。
   */
  public static  E[] array(E... args) {
    return args;
  }

  /**
   * 将一系列对象组装成List。
   * 
   * @param  元素类型。
   * @param args 多个同类型的元素。
   * @return 返回由这些元素组成的List。
   */
  public static  List list(E... args) {
    List list = new ArrayList<>();
    list.addAll(Arrays.asList(args));
    return list;
  }

  /**
   * 追加任意多个新int到int数组末尾。
   * 
   * @param a 现有int数组。
   * @param b 任意多个新int。
   * @return 返回组装好的新int数组。
   */
  public static int[] concat(int[] a, int... b) {
    int[] c = new int[a.length + b.length];
    System.arraycopy(a, 0, c, 0, a.length);
    System.arraycopy(b, 0, c, a.length, b.length);
    return c;
  }

  /**
   * 追加任意多个新元素到数组末尾。
   * 
   * @param  元素的类型。
   * @param a 现有数组。
   * @param b 任意多个新元素。
   * @return 返回组装好的新数组。
   */
  public static  E[] concat(E[] a, E... b) {
    return merge(a, b);
  }

  /**
   * 将数组连接成字符串。
   * 
   * @param delimiter 分隔符。
   * @param args 任意多个元素。
   * @return 连接后的字符串。
   */
  public static String join(String delimiter, Object... args) {
    return join(Arrays.asList(args), delimiter);
  }

  /**
   * 将容器里的元素连接成字符串。
   * 
   * @param list 包含任意多个元素的容器。
   * @param delimiter 分隔符。
   * @return 连接后的字符串。
   */
  public static String join(Collection list, String delimiter) {
    if (list == null || list.isEmpty()) {
      return "";
    }
    if (delimiter == null) {
      delimiter = "";
    }

    StringBuilder s = new StringBuilder();
    boolean first = true;
    for (Object e : list) {
      if (first) {
        first = false;
      } else {
        s.append(delimiter);
      }
      s.append(e);
    }
    return s.toString();
  }

  /**
   * 合并两个数组。
   * 
   * @param  数组元素的类型。
   * @param a 前半部分数组。
   * @param b 后半部分数组。
   * @return 合并后的数组。
   */
  public static  E[] merge(E[] a, E[] b) {
    List list = merge(Arrays.asList(a), Arrays.asList(b));
    return list.toArray(a);
  }

  /**
   * 合并两个List。
   * 
   * @param  List元素的类型。
   * @param a 前半部分List。
   * @param b 后半部分List。
   * @return 合并后的List。
   */
  public static  List merge(List a, List b) {
    List list = new ArrayList<>();
    list.addAll(a);
    list.addAll(b);
    return list;
  }

  /**
   * 从数组中删除所有与给定对象equals的元素。
   * 
   * @param  元素类型。
   * @param a 给定数组。
   * @param e 给定对象
   * @return 去除e之后的数组。
   */
  public static  E[] remove(E[] a, E e) {
    List list = remove(Arrays.asList(a), e);
    return (E[])list.toArray();
  }

  /**
   * 从List中删除所有与给定对象equals的元素。
   * 
   * @param  元素类型。
   * @param a 给定List。
   * @param e 给定对象
   * @return 去除e之后的List。
   */
  public static  List remove(List a, E e) {
    List list = new ArrayList<>();
    for (E o : a) {
      if (!o.equals(e)) {
        list.add(o);
      }
    }
    return list;
  }

  /**
   * 根据给定的下标,选出多个元素,并组成新的数组。
   * 
   * @param  元素类型。
   * @param a 给定数组。
   * @param indexes 任意多个要获取的元素下标。
   * @return 根据下标获得的元素组成的新数组。
   */
  public static  E[] valuesAt(E[] a, int... indexes) {
    List list = valuesAt(Arrays.asList(a), indexes);
    return (E[])list.toArray();
  }

  /**
   * 根据给定的下标,选出多个元素,并组成新的List。
   * 
   * @param  元素类型。
   * @param from 给定List。
   * @param indexes 任意多个要获取的元素下标。
   * @return 根据下标获得的元素组成的新List。
   */
  public static  List valuesAt(List from, int... indexes) {
    List list = new ArrayList<>();
    for (int i : indexes) {
      if (0 <= i && i < from.size()) {
        list.add(from.get(i));
      } else if (-from.size() <= i && i < 0) {
        list.add(from.get(from.size() + i));
      } else {
        list.add(null);
      }
    }
    return list;
  }

  /**
   * 同时给int数组中多个位置同时赋值。
   * 
   * @param a 给定int数组。
   * @param indexes 待赋值的位置下标。
   * @param values 与下标一一对应的int值。
   * @return 返回赋值后的新int数组。
   */
  public static int[] assignAt(int[] a, Integer[] indexes, int... values) {
    if (indexes.length != values.length) {
      throw new IllegalArgumentException(String.format("index.length(%d) != values.length(%d)", indexes.length, values.length));
    }
    for (int i = 0; i < indexes.length; i++) {
      int index = indexes[i];
      if (0 <= index && index < a.length) {
        a[index] = values[i];
      } else if (-a.length <= index && index < 0) {
        a[a.length + index] = values[i];
      } else {
        throw new ArrayIndexOutOfBoundsException(index);
      }
    }
    return a;
  }

  /**
   * 同时给数组中多个位置同时赋值。
   * 
   * @param  数组元素类型。
   * @param a 给定数组。
   * @param indexes 待赋值的位置下标。
   * @param values 与下标一一对应的值。
   * @return 返回赋值后的新数组。
   */
  public static  E[] assignAt(E[] a, Integer[] indexes, E... values) {
    if (indexes.length != values.length) {
      throw new IllegalArgumentException(String.format("index.length(%d) != values.length(%d)", indexes.length, values.length));
    }
    for (int i = 0; i < indexes.length; i++) {
      int index = indexes[i];
      if (0 <= index && index < a.length) {
        a[index] = values[i];
      } else if (-a.length <= index && index < 0) {
        a[a.length + index] = values[i];
      } else {
        throw new ArrayIndexOutOfBoundsException(index);
      }
    }
    return a;
  }

  /**
   * 根据规定格式,对容器中的每个元素进行格式化,并返回格式化后的结果。
   * 
   * @param from 包含任意多个元素的容器。
   * @param format 格式化模板,与printf兼容。
   * @return 格式化后的新列表。
   */
  public static List map(Collection from, String format) {
    List to = new ArrayList<>(from.size());
    for (Object e : from) {
      to.add(String.format(format, e));
    }
    return to;
  }

  /**
   * 拆分容器,每份至多包含n个元素,将每堆元素连接成一个独立字符串。
   * @param from 包含任意多个元素的容器。
   * @param n 子元素个数。
   * @param delimiter 分隔符。
   * @return 拆分后的字符串List。
   */
  public static List partition(Collection from, int n, String delimiter) {
    List to = new ArrayList<>();
    List buffer = new ArrayList<>(n);
    for (String e : from) {
      buffer.add(e);
      if (buffer.size() >= n) {
        to.add(join(buffer, delimiter));
        buffer.clear();
      }
    }
    return to;
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy