2016-02-05 13 views
8

Niedawno był zadał to pytanie w wywiadzie:Jak znaleźć pierwszego znaku ciągu znaków bez użycia metody API

Znajdź pierwszy charakter String bez stosowania jakiejkolwiek metody z String klasy

dał następujące podejścia, zakładając str jako wyrażenie:

  1. str.charAt(0)
  2. str.toCharArray()[0]
  3. str.substring(0,1)

Czy ktoś może zaproponować mi sposób można to osiągnąć?

+9

Nie możesz. To bardzo głupie pytanie, które należy zadać w wywiadzie ... (Zakładam, że nie możesz zbudować ciągu 'StringBuilder' przechodzącego w ciągu znaków i przyjąć jego pierwszą postać, na przykład ... wszystkie rodzaje głupich rzeczy sugerują się, ale nic, co naprawdę warto wiedzieć.) –

+1

Wszyscy ankieterzy zadający tego rodzaju pytania powinni zobaczyć ten komentarz od Jona. – user3437460

+0

Możesz użyć refleksji. A może 'charAt' z' StringBuilder'. – Pshemo

Odpowiedz

4

Korzystanie Matcher API (i nie String): możemy stworzyć wzór, który rejestruje każdy znak, ale tylko znaleźć pierwszy i wydrukować to (dotall mode jest włączona obsłużyć przypadek, gdy pierwszy znak to separator linii).

public static void main(String[] args) { 
    Matcher matcher = Pattern.compile("(.)", Pattern.DOTALL).matcher("foobar"); 
    if (matcher.find()) { 
     System.out.println(matcher.group(1)); // prints "f" 
    } 
} 
1

użyciu odbicia można uzyskać dostęp do

private final char value[]; 

tablicy z String klasy, która przechowuje wszystkie znaki. Więc twój kod mógłby wyglądać następująco:

String str = "abc"; 
Field f = String.class.getDeclaredField("value"); 
f.setAccessible(true); 
char[] chars = (char[]) f.get(str); 
System.out.println(chars[0]); 

wyjściowa: a.


Również technicznie StringBuilder API nie jest taka sama jak String więc możemy również użyć

String str = "abc"; 
System.out.println(new StringBuilder(str).charAt(0)); 
//          ^-comes from StringBuilder, not String 
+0

Używa to metody (statycznej) z klasy "String" i dlatego nie spełnia wymagań pytania. –

+0

@DanForbes Do jakiej metody się odwołujesz? – Pshemo

+0

'String.class.getDeclaredField' –

2

s.charAt(0) wykorzystuje CharSequence API, nie String, więc formalnie to jest poprawna odpowiedź.

Inną opcją jest użycie metody akceptującej CharSequence jako argument, np. sol. jeden z Commons Lang StringUtils ".

+0

['subSequence'] (https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#subSequence-int-int-) jest nadpisywany w klasie" String ", tak jak ['charAt'] (https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#charAt-int-). – Tunaki

+0

Ściśle mówiąc, myślę, że masz rację ... :) – Tunaki

1

Można użyć StringReader i przeczytać pierwszy znak:

char firstChar = (char) new StringReader(str).read(); 
1

Innym głupie rozwiązanie przy użyciu niestandardowego Scenariusz:

private class PseudoWriter extends Writer { 

    private Character first; 

    public void write(char[] cbuf, int off, int len) throws IOException { 
     if (first == null) { 
      first = cbuf[off]; 
     } 
    } 

    public void flush() throws IOException {} 
    public void close() throws IOException {} 

    public Character getFirstChar() { 
     return first; 
    } 
} 

Zastosowanie:

String s = "Lorem ipsum"; 

PseudoWriter pseudoWriter = new PseudoWriter(); 
pseudoWriter.write(s); 
Character first = pseudoWriter.getFirstChar(); 
Powiązane problemy