Jeśli mam dwie tablice byte[]
, czy istnieje wbudowana funkcja porównywania ich alfa C: memcmp()
?odpowiednik memcmp() w Javie?
Odpowiedz
Istnieje Arrays.equals().
Nie wiem, czy implementacja JVM faktycznie optymalizuje to, jeśli istnieje odpowiednia instrukcja w sprzęcie, ale wątpię w to.
Ponadto, jeśli dobrze pamiętam mój C, strcmp działa aż do terminatora o wartości NULL (co czyni go użytecznym dla ciągów C), wersja The Arrays porówna całą tablicę, ponieważ programiści Java rzadko zadają sobie trud z tablicami zakończonymi znakiem NUL. Możesz jednak łatwo napisać własną funkcję, jeśli zależy ci na terminatorze kończącym połączenie.
[Arrays.equals] [1]
[1]: http://java.sun.com/j2se/1.5.0/docs/api/java/util/Arrays.html#equals(byte[], byte [])
Sposób java.util.Arrays.equals(byte[], byte[]) jest twoim przyjacielem.
Cóż, Arrays.equals()
jest dobre, ale nie może porównywać podzakresów. W tym przypadku istnieje również ścieżka przez i późniejsza .subList()
, ale nie dla elementów podstawowych, takich jak byte[]
.
W rzeczywistości nie ma bezpośredniego odpowiednika memcmp()
. Oto discussion i jak tylko się dowiem, jest już w tym samym stanie (15 lat). Większość "natywnej" implementacji może zostać osiągnięta przez moją opcję za pomocą metody java.nio.ByteBuffer
(wrap()
, a następnie equals()
). Ale jest to dość duża ilość kodu.
Dla osób, które w pełni nie rozumieją tematu: memcmp()
jest zaimplementowany w sposób zależny od platformy, co jest bardzo wydajne i nic w Javie aktualnie się do niego nie zbliża. Wszelkie cykle ręczne są daleko w tyle pod względem wydajności, przynajmniej z powodu sprawdzania zakresu indeksów. Może któregoś dnia ludzie, którzy pochodzą z osadzonego C/C++ będą zadowoleni z tego tematu :-).
plus 1, aby wymienić podzakresy. W takim przypadku można użyć 'Arrays.copyOfRange()' z 'Arrays.equals()', ale prawdopodobnie i tak nie będzie wydajne. –
Memcmp zwraca wartość int, mniejszą niż, równą lub większą od zera, jeśli pierwsze n bajtów s1 zostanie znalezione, odpowiednio, mniej niż, aby dopasować lub być większe niż pierwsze n bajtów s2. Zwraca wartość boolean. To nie jest ta sama funkcja. Ponadto memcmp porównuje bajty jako niepodpisane znaki.
myślę, że to może działać:
public int memcmp(byte b1[], byte b2[], int sz){
for(int i = 0; i < sz; i++){
if(b1[i] != b2[i]){
if(b1[i] >= 0 && b2[i] >= 0)
return b1[i] - b2[i];
if(b1[i] < 0 && b2[i] >= 0)
return 1;
if(b2[i] < 0 && b1[i] >= 0)
return -1;
if(b1[i] < 0 && b2[i] < 0){
byte x1 = (byte) (256 + b1[i]);
byte x2 = (byte) (256 + b2[i]);
return x1 - x2;
}
}
}
return 0;
}
(edit) W rzeczywistości część dopełnienie przez 2 nie jest konieczne:
public static int memcmp(byte b1[], byte b2[], int sz){
for(int i = 0; i < sz; i++){
if(b1[i] != b2[i]){
if((b1[i] >= 0 && b2[i] >= 0)||(b1[i] < 0 && b2[i] < 0))
return b1[i] - b2[i];
if(b1[i] < 0 && b2[i] >= 0)
return 1;
if(b2[i] < 0 && b1[i] >=0)
return -1;
}
}
return 0;
}
Czy powrót 1 i powrót -1 nie są odwrócone? –
- 1. Odpowiednik std :: vector w Javie?
- 2. Odpowiednik LINQ w Javie 8
- 3. Odpowiednik funkcji krypt PHP w Javie
- 4. Odpowiednik metod anonimowych C# w Javie?
- 5. zwraca wartość memcmp (ptr1, ptr2, 0)?
- 6. W Javie jest odpowiednik klasy Konwertuj z C#?
- 7. Czy istnieje odpowiednik getch() z C++ w Javie?
- 8. Co to jest odpowiednik C#/.NET BufferedInputStream (w Javie)?
- 9. Odpowiednik interwału Jwalime'a w Javie 8 Data i godzina API
- 10. Porównywanie struktur w C za pomocą memcmp() i arytmetyki wskaźnika
- 11. Równoważnik DataTable w Javie
- 12. Odpowiednik LastCall.IgnoreArguments w EasyMock
- 13. rodzaju typów w Javie
- 14. memcmp, ale trzeba porównać blok o ustalonej wartości
- 15. Odpowiednik debugowania w języku Java?
- 16. Odpowiednik "Wydarzenie" Pythona w języku Java?
- 17. C++ odpowiednik "super"?
- 18. Odpowiednik w języku Java dla cin (C++)
- 19. Jak uzyskać adres URL nadrzędny w Javie?
- 20. Java odpowiednik Gdzie Klauzula w C# LINQ
- 21. Jak programowo ustawić strefę czasową w Javie?
- 22. Czy w języku Java istnieje odpowiednik epollu?
- 23. Oracle odpowiednik Java Varargs
- 24. Java odpowiednik klasy .NET's Version?
- 25. Równoważnik strony głównej ASP.NET w Javie
- 26. Rejestrowanie HTTP JAX-WS w Javie 1.7
- 27. Co jest odpowiednikiem funkcji "nth_element" w Javie?
- 28. Czy istnieje odpowiednik PHP dla `public static main (String [] args)` w Javie?
- 29. jest odpowiednik modułu żądania Pythona w Javie do pracy na aplikacji opartej na REST
- 30. Odpowiednik iif w C#
Jestem ciekawy dla przypadku, gdy ktoś null wypowiedzieć ich własna tablica w Javie –
Nigdy tego nie próbowałem, ale przypuszczam, że gdyby wywołać natywną metodę w C i użyć bufora ... – Uri
Skąd się wziął strcmp? Pytanie dotyczyło memcmp i nie widzę też strcmp w historii edycji. – laalto