算法笔记
查到吐的一些代码
1.Autoboxing: int[] --> Integer[]
1.Loop, nasty but fast, doable because of Integer.valueOf()
int[] arr = {1, 2, 3};
Integer[] res = new Integer[arr.length];
int j = 0;
for (int i : arr) {
res[j++] = i;
}
2.Java8, the stream is as slow as fuck, and looks like a line of shit
int[] arr = {1,2,3};
Integer[] res = Arrays.stream( arr ).boxed().toArray( Integer[]::new );
3.ArrayUtil(?)
Integer[] res = ArrayUtils.toObject(arr); // did not try
2.Unboxing: Integer[] --> int[]
Doable because of Integer.intValue()
Integer[] arr = {1, 2, 3};
int[] res = new int[arr.length];
int j = 0;
for (int i : arr) {
res[j++] = i;
}
3.int[] --> ArrayList()
int[] original = {1,2,3};
List<Integer> res = new ArrayList<>();
for (int i : original) {
res.add(i);
}
return res;
4.ArrayList() --> int[]
1.loop
List<Integer> arr = new ArrayList<>(Arrays.asList(1, 2, 3));
int[] res = new int[arr.size()];
int j = 0;
for (int i : arr) {
res[j++] = i;
}
return res;
2.java8
List<Integer> arr = new ArrayList<>(Arrays.asList(1, 2, 3));
// 1.
int[] res1 = arr.stream().mapToInt(i -> i).toArray();
// 2.
int[] res2 = arr.stream().mapToInt(Integer::intValue).toArray();
5.Integer[] --> ArrayList
Notice that Arrays.asList only works for wrapper classes
Integer[] original = {1, 3, 4};
List<Integer> arr = new ArrayList<>(Arrays.asList(original));
return arr;
6.ArrayList --> Integer[]
List<Integer> arr = new ArrayList<>(Arrays.asList(1, 2, 3));
Integer[] res = arr.toArray(new Integer[arr.size()]);
Containers之间的转换
集合之间的转换大概代码如下:不过这边的addAll只对object有效,对primitives无效,所以有时候还是需要手动loop
Set<Integer> set = new HashSet<>(Arrays.asList(original));
List<Integer> res = new LinkedList<>(set); // HashSet -> LinkedList
res.addAll(res);
Map的写法
- 统计数组中各数字出现的次数
Integer[] original = {1, 3, 4, 1};
HashMap<Integer, Integer> map = new HashMap<>(); // number, count
for (int i : original) {
map.put(i, map.getOrDefault(i, 0) + 1); // replace null returned by map.get("non-exist element")
}
对比下python
>>> d = {}
>>> l = [1, 2, 3, 1]
>>> for i in l:
... d[i] = d.get(i, 0) + 1
...
>>> d
{1: 2, 2: 1, 3: 1}
混合用法,参见350, 350. Intersection of Two Arrays II
- 统计keySet(), values()中的最大值
可以使用Collections.max,底层是interator
int maxKey = Collections.max(map.keySet());
int maxValue = Collections.max(map.values());
Entry, Iterator的用法
Map<Integer, Integer> map = new HashMap<>();
map.put(1, 2);
// for each: entrySet(key-value pair)
for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
int key = entry.getKey();
int value = entry.getValue();
}
// iterator: key
Iterator<Integer> it = map.keySet().iterator();
int key = it.next();
// for each: values
for (int value : map.values()) {
System.out.println(value);
}
- Sort map by values or keys
参见 347. Top K Frequent Elements
其他杂七杂八的api用法:https://www.nyannko.cf/posts/containers.html