Когда вы создаете регулярное выражение, у вас есть возможность захвата частей матча и сохранения их в качестве заполнителей. Они нумеруются начиная с $1
.
Например:
/A(\d+)B(\d+)C/
Это будет захватывать из A90B3C
значения 90
и 3
. Если вам нужно группировать вещи, но не хотите их захватывать, используйте (?:...)
версию вместо (...)
.
Цифры начинаются слева направо в том порядке, в котором скобки открыты. Это означает:
/A((\d+)B)(\d+)C/
При сопоставлении с той же строкой будут записаны 90B
, 90
и 3
.
Преобразовывают интервал [] к Целому числу []:
import java.util.Arrays;
...
int[] aint = {1,2,3,4,5,6,7,8,9,10};
Integer[] aInt = new Integer[aint.length];
Arrays.setAll(aInt, i -> aint[i]);
Если вы хотите преобразовать int []
в Integer []
, в JDK нет автоматического способа сделать это . Однако вы можете сделать что-то вроде этого:
int[] oldArray;
... // Here you would assign and fill oldArray
Integer[] newArray = new Integer[oldArray.length];
int i = 0;
for (int value : oldArray) {
newArray[i++] = Integer.valueOf(value);
}
Если у вас есть доступ к библиотеке Apache lang , тогда вы можете использовать метод ArrayUtils.toObject (int [])
, подобный этому :
Integer[] newArray = ArrayUtils.toObject(oldArray);
Предположительно вы хотите, чтобы ключ к карте совпадал по значению элементов, а не по идентичности массива. В этом случае вам нужен какой-то объект, который определяет , равно
и hashCode
, как и следовало ожидать. Проще всего преобразовать в List
, либо ArrayList
, либо лучше использовать Arrays.asList
. Лучше, чем это, вы можете ввести класс, представляющий данные (аналогичный java.awt.Rectangle
, но я рекомендую сделать переменные закрытыми финальными, а класс также финальным).
Вместо того, чтобы писать свои собственные код, вы можете использовать IntBuffer для обертывания существующего int [] без необходимости копировать данные в массив Integer
int[] a = {1,2,3,4};
IntBuffer b = IntBuffer.wrap(a);
IntBuffer реализует сопоставимые, так что вы можете использовать код, который вы уже написали. Формально сопоставляет ключи сравнения таким образом, что a.equals (b) используется, чтобы сказать, что два ключа равны, поэтому два IntBuffers с массивом 1, 2, 3 - даже если массивы находятся в разных местах памяти - считаются равными и поэтому будут работайте для своего частотного кода.
ArrayList<int[]> data = ... // load a dataset`
Map<IntBuffer, Double> frequencies = new HashMap<IntBuffer, Double>();
for(int[] a : data) {
IntBuffer q = IntBuffer.wrap(a);
if(frequencies.containsKey(q)) {
frequencies.put(q, tfs.get(q) + p);
} else {
frequencies.put(q, p);
}
}
Надеюсь, что это поможет
Я ошибся в предыдущем ответе. Правильное решение - использовать этот класс в качестве ключа в карте, обертывающей фактический int [].
public class IntArrayWrapper {
int[] data;
public IntArrayWrapper(int[] data) {
this.data = data;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
IntArrayWrapper that = (IntArrayWrapper) o;
if (!Arrays.equals(data, that.data)) return false;
return true;
}
@Override
public int hashCode() {
return data != null ? Arrays.hashCode(data) : 0;
}
}
, и изменить свой код следующим образом:
Map<IntArrayWrapper, Double > freqs = new HashMap<IntArrayWrapper, Double>();
for (int[] data : datas) {
IntArrayWrapper wrapper = new IntArrayWrapper(data);
if ( freqs.containsKey(wrapper)) {
freqs.put(wrapper, freqs.get(wrapper) + p);
}
freqs.put(wrapper, p);
}
вам не нужно. int []
является объектом и может использоваться как ключ внутри карты.
Map<int[], Double> frequencies = new HashMap<int[], Double>();
- правильное определение карты частот.
Это было неверно :-). Также опубликовано правильное решение: