Функция:
public float simpleSimilarity(String u, String v) {
String[] a = u.split(" ");
String[] b = v.split(" ");
long correct = 0;
int minLen = Math.min(a.length, b.length);
for (int i = 0; i < minLen; i++) {
String aa = a[i];
String bb = b[i];
int minWordLength = Math.min(aa.length(), bb.length());
for (int j = 0; j < minWordLength; j++) {
if (aa.charAt(j) == bb.charAt(j)) {
correct++;
}
}
}
return (float) (((double) correct) / Math.max(u.length(), v.length()));
}
Тест:
String a = "This is the first string.";
String b = "this is not 1st string!";
// for exact string comparison, use .equals
boolean exact = a.equals(b);
// For similarity check, there are libraries for this
// Here I'll try a simple example I wrote
float similarity = simple_similarity(a,b);
Просто предоставив тегу input
переменную шаблона, #inputPhoneNumber
назначит объектное представление JavaScript этого HTMLElement
переменной шаблона.
Попробуйте это с помощью:
<p> Input Field - With Just Template Varaible:</p>
<input
class="form-control"
type="text"
[(ngModel)]="phoneNumber"
pattern="[\d]*"
#first
required
/>
<div *ngIf="first.errors?.pattern">
Phone number must only contain digits
</div>
<div>Two Way Binding: {{phoneNumber}}</div>
<div>ViewChild Native Element: {{viewChildFirst?.nativeElement | json}}</div>
<div>ViewChild Control: {{viewChildFirst.control | json}}</div>
<div>#first: {{first?.value}}</div>
И в классе компонентов:
@ViewChild('first') viewChildFirst;
Как совершенно очевидно, viewChildFirst.control
не будет определяться в этом случае. [ 1117]
Но при назначении ngModel
переменной шаблона будет назначено представление FormControl
этого элемента HTML переменной шаблона.
Попробуйте это с помощью:
<p> Input Field - With Template And ngModel assigned</p>
<input
class="form-control"
type="text"
[(ngModel)]="phoneNumber"
pattern="[\d]*"
#second="ngModel"
required
/>
<div *ngIf="second.errors?.pattern">
Phone number must only contain digits
</div>
<div>Two Way Binding: {{phoneNumber}}</div>
<div>ViewChild Native Element: {{viewChildSecond?.nativeElement}}</div>
<div>ViewChild Conttrol: {{viewChildSecond.control | json}}</div>
<div>#second: {{second?.value}}</div>
<hr>
А в классе компонентов:
@ViewChild('second') viewChildSecond;
На этот раз viewChildSecond?.nativeElement
не будет определено, но viewChildSecond.control
будет. [+1121]
Вы можете проверить это, точно распечатав переменную шаблона, как я делал выше. Вот рабочий образец StackBlitz для вашей ссылки.
BLOCKQUOTE>