Самый чистый подход, который я нашел, - это упрощенная версия метода, используемого jQuery offset
. Подобно некоторым другим ответам, он начинается с getBoundingClientRect
; он затем использует window
и documentElement
для настройки положения прокрутки, а также таких вещей, как маржа на body
(часто по умолчанию).
var rect = el.getBoundingClientRect();
var docEl = document.documentElement;
var rectTop = rect.top + window.pageYOffset - docEl.clientTop;
var rectLeft = rect.left + window.pageXOffset - docEl.clientLeft;
var els = document.getElementsByTagName("div");
var docEl = document.documentElement;
for (var i = 0; i < els.length; i++) {
var rect = els[i].getBoundingClientRect();
var rectTop = rect.top + window.pageYOffset - docEl.clientTop;
var rectLeft = rect.left + window.pageXOffset - docEl.clientLeft;
els[i].innerHTML = "<b>" + rectLeft + ", " + rectTop + "</b>";
}
div {
width: 100px;
height: 100px;
background-color: red;
border: 1px solid black;
}
#rel {
position: relative;
left: 10px;
top: 10px;
}
#abs {
position: absolute;
top: 250px;
left: 250px;
}
<div id="rel"></div>
<div id="abs"></div>
<div></div>
Вот мое решение:
String[] chars = {"1","2","10"};
//sort the array by length, so we check the longest string first.
Arrays.sort(chars, (a,b)->b.length()-a.length());
String foo = "1 2 3 4 5 6 7 8 9 10";
String newFoo = "";
for(int i = 0; i <= foo.length();){
int j = i;
for(String s : chars){
if(foo.length() > i + s.length()){
//find subString instead of character.
String sub = foo.substring(i, i + s.length());
if (sub.equals(s)) {
//move to the next index. Ex if 10 is at 0, next check start at 2
i += sub.length();
newFoo += sub;
break;
}
}
}
// check the index if it has been modified
i = i == j ? ++j : i;
}
System.out.println(newFoo);
Я бы поместил их в HashSet
, а затем отфильтровал символы, которых нет в этом наборе.
// put in a nice hash set for speedy lookups.
Set<Character> chars = new HashSet(Arrays.asList('1','2','3'));
// method 1
String foo = "abc123 foo !@#";
String newFoo = "";
for(int i = 0; i < foo.length(); i++){
char c = foo.charAt(i);
if(!chars.contains(c)) {
newFoo += c;
}
}
System.out.println(newFoo);
// method 2
String result = foo.chars()
.mapToObj(c -> (char)c)
.filter(c -> !chars.contains(c))
.map(c -> String.valueOf(c))
.collect(Collectors.joining(""));
System.out.println("result is: "+result);
Это может работать не во всех ситуациях, но для конкретного примера, который вы опубликовали, мы можем достичь вашего результата с помощью приведенного ниже кода.
По сути, мы конвертируем ваш массив в List
для доступа к методу contains()
. Затем мы разделяем исходную строку foo
, чтобы мы могли проверить, существует ли какое-либо из этих значений в исходном массиве.
import java.util.Arrays;
import java.util.List;
class Test {
public static void main(String[] args) {
String[] strings = {"1", "2", "10"};
String foo = "1 2 3 4 5 6 7 8 9 10";
// We'll use a StringBuilder for this
StringBuilder newString = new StringBuilder();
// First, we'll convert our strings array to a List so we have access to the [contains] method
List<String> stringsList = Arrays.asList(strings);
// Now, let's split foo into an array, using the space as a delimiter
String[] foos = foo.split(" ");
// Loop through each entry of foos and compare to each element in stringsList
for (int i = 0; i < foos.length; i++) {
if (stringsList.contains(foos[i])) {
newString.append(foos[i]);
}
}
System.out.println(newString);
}
}
1210
Вы можете попробовать код ниже. Если вы хотите пропустить дубликаты, вы можете использовать Set
,
String[] strings = {"1", "2", "10"};
String foo = "1 2 3 4 5 6 7 8 9 10".replaceAll("\\s","");
StringBuilder newString = new StringBuilder();
List<String> stringsList = Arrays.asList(strings);
//Set can be used to avoid duplicates like "1 1 2 2 4 4"
Set<String> resSet=new HashSet<String>();
// Loop through each entry of foos and compare to each element in stringsList
for (int i = 0; i < foo.length(); i++) {
//if current char and next is 10 add it and continue
if((String.valueOf(foo.charAt(i))+String.valueOf(foo.charAt(i+1))).equals("10") && stringsList.contains("10"))
{
resSet.add("10");
//Extra operation in case you want to avoid duplication
newString.append(10);
i++;
continue;
}
//if match found add it
if (stringsList.contains(String.valueOf(foo.charAt(i)))) {
newString.append(String.valueOf(foo.charAt(i)));
//Extra operation in case you want to avoid duplication
resSet.add(String.valueOf(foo.charAt(i)));
}
}
System.out.println(newString);
System.out.println(resSet);